調stc15串口,從stc-isp工具中復制了范例改下調試出現關于校驗位的一個問題。
范例編譯調試都是正常的,其校驗位是固定的,使用宏定義 :
- #define NONE_PARITY 0 //無校驗
- #define ODD_PARITY 1 //奇校驗
- #define EVEN_PARITY 2 //偶校驗
- #define MARK_PARITY 3 //標記校驗
- #define SPACE_PARITY 4 //空白校驗
- #define PARITYBIT NONE_PARITY //定義校驗位
復制代碼 為了使其在運行中可變校驗位,就將PARITYBIT 改成了全局變量:
- BYTE PARITYBIT=NONE_PARITY;//先默認無校驗測試
復制代碼 初始化也做了相應修改:
- /*
- #if (PARITYBIT == NONE_PARITY)
- SCON = 0x50; //8位可變波特率
- #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
- SCON = 0xda; //9位可變波特率,校驗位初始為1
- #elif (PARITYBIT == SPACE_PARITY)
- SCON = 0xd2; //9位可變波特率,校驗位初始為0
- #endif
- */
- //改為如下:
- switch(PARITYBIT)
- {
- case NONE_PARITY:
- SCON = 0x50;
- break;//8位可變波特率
- case ODD_PARITY:
- case EVEN_PARITY:
- case MARK_PARITY:
- SCON = 0xda;
- break; //9位可變波特率,校驗位初始為1
- case SPACE_PARITY:
- SCON = 0xd2;
- break; //9位可變波特率,校驗位初始為0
- default:
- break;
- }
復制代碼
發送程序中也改為如下:
- void SendData(BYTE dat)
- {
- while (busy); //等待前面的數據發送完成
- ACC = dat; //獲取校驗位P (PSW.0)
- if (P) //根據P來設置校驗位
- {
- /*
- #if (PARITYBIT == ODD_PARITY)
- TB8 = 0; //設置校驗位為0
- #elif (PARITYBIT == EVEN_PARITY)
- TB8 = 1; //設置校驗位為1
- #endif*/
- if(PARITYBIT == ODD_PARITY)
- TB8 = 0; //設置校驗位為0
- else if(PARITYBIT == EVEN_PARITY)
- TB8 = 1; //設置校驗位為1
- }
- else
- { /*
- #if (PARITYBIT == ODD_PARITY)
- TB8 = 1; //設置校驗位為1
- #elif (PARITYBIT == EVEN_PARITY)
- TB8 = 0; //設置校驗位為0
- #endif */
- if(PARITYBIT == ODD_PARITY)
- TB8 = 1; //設置校驗位為1
- else if(PARITYBIT == EVEN_PARITY)
- TB8 = 0; //設置校驗位為0
- }
- busy = 1;
- SBUF = ACC; //寫數據到UART數據寄存器
- }
復制代碼
為了便于對比,范例原代碼修改部分都注釋掉了。串口工具接收數據觀察如下:
修改前,程序循環發送字符串:“STC15F2K60S2 Uart Test !”,串口接收顯示正常。
修改后,串口接收的數據變成了:全部0x00,“\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0”
如將 SendData 中 if(P)部分注釋掉,即不設置校驗位,發送即為正常:“STC15F2K60S2 Uart Test !”
那問題也就出現在 sendData 中的if(P) 部分。
個人理解,如果 PARITYBIT=NONE_PARITY 那么if(P)以下判斷語句實際并未執行。
哪位幫忙看看 sendData 中該如何修改:
stcxx.rar
(10.5 KB, 下載次數: 9)
2020-6-18 15:08 上傳
點擊文件名下載附件
串口校驗位
|