欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
stc15單片機串口范例校驗位的一個問題
[打印本頁]
作者:
gongzhu
時間:
2020-6-18 15:09
標(biāo)題:
stc15單片機串口范例校驗位的一個問題
調(diào)stc15串口,從stc-isp工具中復(fù)制了范例改下調(diào)試出現(xiàn)關(guān)于校驗位的一個問題。
范例編譯調(diào)試都是正常的,其校驗位是固定的,使用宏定義 :
#define NONE_PARITY 0 //無校驗
#define ODD_PARITY 1 //奇校驗
#define EVEN_PARITY 2 //偶校驗
#define MARK_PARITY 3 //標(biāo)記校驗
#define SPACE_PARITY 4 //空白校驗
#define PARITYBIT NONE_PARITY //定義校驗位
復(fù)制代碼
為了使其在運行中可變校驗位,就將PARITYBIT 改成了全局變量:
BYTE PARITYBIT=NONE_PARITY;//先默認無校驗測試
復(fù)制代碼
初始化也做了相應(yīng)修改:
/*
#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;
}
復(fù)制代碼
發(fā)送程序中也改為如下:
void SendData(BYTE dat)
{
while (busy); //等待前面的數(shù)據(jù)發(fā)送完成
ACC = dat; //獲取校驗位P (PSW.0)
if (P) //根據(jù)P來設(shè)置校驗位
{
/*
#if (PARITYBIT == ODD_PARITY)
TB8 = 0; //設(shè)置校驗位為0
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 1; //設(shè)置校驗位為1
#endif*/
if(PARITYBIT == ODD_PARITY)
TB8 = 0; //設(shè)置校驗位為0
else if(PARITYBIT == EVEN_PARITY)
TB8 = 1; //設(shè)置校驗位為1
}
else
{ /*
#if (PARITYBIT == ODD_PARITY)
TB8 = 1; //設(shè)置校驗位為1
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 0; //設(shè)置校驗位為0
#endif */
if(PARITYBIT == ODD_PARITY)
TB8 = 1; //設(shè)置校驗位為1
else if(PARITYBIT == EVEN_PARITY)
TB8 = 0; //設(shè)置校驗位為0
}
busy = 1;
SBUF = ACC; //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
}
復(fù)制代碼
為了便于對比,范例原代碼修改部分都注釋掉了。串口工具接收數(shù)據(jù)觀察如下:
修改前,程序循環(huán)發(fā)送字符串:“STC15F2K60S2 Uart Test !”,串口接收顯示正常。
修改后,串口接收的數(shù)據(jù)變成了:全部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)部分注釋掉,即不設(shè)置校驗位,發(fā)送即為正常:“STC15F2K60S2 Uart Test !”
那問題也就出現(xiàn)在 sendData 中的if(P) 部分。
個人理解,如果
PARITYBIT=NONE_PARITY
那么if(P)以下判斷語句實際并未執(zhí)行。
哪位幫忙看看 sendData 中該如何修改:
stcxx.rar
(10.5 KB, 下載次數(shù): 9)
2020-6-18 15:08 上傳
點擊文件名下載附件
串口校驗位
作者:
gongzhu
時間:
2020-6-19 09:15
直接了當(dāng)?shù)貑枺?br /> 當(dāng) PARITYBIT = NONE_PARITY ;
以下兩段代碼一個發(fā)送數(shù)據(jù)不正常,一個發(fā)送正常:
void SendData(BYTE dat)
{
while (busy); //等待前面的數(shù)據(jù)發(fā)送完成
ACC = dat; //獲取校驗位P (PSW.0)
if (P) //根據(jù)P來設(shè)置校驗位
{
if(PARITYBIT == ODD_PARITY)
TB8 = 0; //設(shè)置校驗位為0
else if(PARITYBIT == EVEN_PARITY)
TB8 = 1; //設(shè)置校驗位為1
}
else
{
if(PARITYBIT == ODD_PARITY)
TB8 = 1; //設(shè)置校驗位為1
else if(PARITYBIT == EVEN_PARITY)
TB8 = 0; //設(shè)置校驗位為0
}
busy = 1;
SBUF = ACC; //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
}
復(fù)制代碼
void SendData(BYTE dat)
{
while (busy); //等待前面的數(shù)據(jù)發(fā)送完成
ACC = dat; //獲取校驗位P (PSW.0)
busy = 1;
SBUF = ACC; //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
}
復(fù)制代碼
個人覺得
if (P)
下面只對奇偶校驗判斷做了處理,并無無校驗的處理部分,理論上以上兩段代碼應(yīng)該都正常。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1