1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉
標題:
stc15單片機串口范例校驗位的一個問題
[打印本頁]
作者:
gongzhu
時間:
2020-6-18 15:09
標題:
stc15單片機串口范例校驗位的一個問題
調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 上傳
點擊文件名下載附件
串口校驗位
作者:
gongzhu
時間:
2020-6-19 09:15
直接了當地問:
當 PARITYBIT = NONE_PARITY ;
以下兩段代碼一個發送數據不正常,一個發送正常:
void SendData(BYTE dat)
{
while (busy); //等待前面的數據發送完成
ACC = dat; //獲取校驗位P (PSW.0)
if (P) //根據P來設置校驗位
{
if(PARITYBIT == ODD_PARITY)
TB8 = 0; //設置校驗位為0
else if(PARITYBIT == EVEN_PARITY)
TB8 = 1; //設置校驗位為1
}
else
{
if(PARITYBIT == ODD_PARITY)
TB8 = 1; //設置校驗位為1
else if(PARITYBIT == EVEN_PARITY)
TB8 = 0; //設置校驗位為0
}
busy = 1;
SBUF = ACC; //寫數據到UART數據寄存器
}
復制代碼
void SendData(BYTE dat)
{
while (busy); //等待前面的數據發送完成
ACC = dat; //獲取校驗位P (PSW.0)
busy = 1;
SBUF = ACC; //寫數據到UART數據寄存器
}
復制代碼
個人覺得
if (P)
下面只對奇偶校驗判斷做了處理,并無無校驗的處理部分,理論上以上兩段代碼應該都正常。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1