欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
MCU串口異步通訊過程中的奇偶校驗和停止位深入研究
[打印本頁]
作者:
愛51hei
時間:
2015-10-29 12:46
標題:
MCU串口異步通訊過程中的奇偶校驗和停止位深入研究
在連續的高速異步通訊中,如果沒有作為握手用的信號位,那么如何辨識一個字符幀的開始變成了難題。從一串連續的數字中找出字節的幀頭,然后正確的識別出要傳輸的信息,除非做多次嘗試,并且通訊雙方約定好起始信息,方可正確傳輸信息。此時,為了讓信號有較為明顯的辨識信息,增加奇偶校驗位,以及加長停止位的長度,都是一個提高幀起始判定的一種方法。
在波特率為115200的設置下,如果采用N,8,1的標準設置,可以從下面的波形圖中看出,如果連續發送字符0x55,則停止位到下一個起始位之間的脈寬是11.12us, 而標準的數字位的脈寬是8.83us。如果在兩個數據的發送之間沒有其他延時信號,則可能無法分辨出那一個位是一個字符幀的起始位,從而導致后續其它字符的幀錯誤。這樣在使用軟件方法做串行數據接收時,就會出錯。
圖1,在波特率115200時,標準位脈沖寬度為8.83us
圖2,在波特率115200時,停止位到下一個起始位的寬度可能更小,這里是11.12us。
圖3,出現幀判別錯誤的情形(這里是奇偶校驗設置不正確導致)。
為了解決這個異常,可以通過加長停止位的方法,提高軟件對起始位的識別幾率。因此上可以將常用的1個停止位,增加到1.5個或2個位長度。對于長線傳輸,為了檢查傳輸過程中信號是否受其他干擾而導致的翻轉,又在停止位之前,插入奇偶校驗位的方式,協議商定傳輸的1的個數是奇數個或者偶數個,然后通過插補的方式確定每幀的情況相同。這樣,如果在接收端發現幀錯誤,可以及時檢查出來。
使用C51的發送程序:
sbit
TXB = P3^
1
;
sbit
RXB = P3^
0
;
bit
bUartBusy;
//串口正在使用的標志
unsigned char
bEven;
//用來計算偶校驗的和
#define ON 1
#define OFF 0
// #define EVENPARITY
//#define STOP2BITS
void
SendChar(
unsigned char
c)
{
unsigned char
nCnt;
TXB=
0
;
//串口起始位開始
TR0 =
1
;
//定時器0開始計時
ET0 =
1
;
//使能定時器0中斷
bUartBusy = ON;
//bUartBusy 在Timer0的服務程序中設置為OFF
while
(bUartBusy == ON);
//維持當前TXB的電平,直到下一次中斷到來。輸出一個位寬的數據。
//由低位開始,將數據通過串口輸出
#ifdef
EVENPARITY
//如果定義偶校驗
bEven=
0
;
//偶校驗的初值為0.
#endif
for
(nCnt =
0
; nCnt <
8
; nCnt++) {
TXB =c &
0x01
;
//輸出最低位
#ifdef
EVENPARITY
bEven = bEven + (c &
0x01
);
//偶校驗計算,把所有的1加起來
#endif
c >>=
1
;
//右移一位,準備在下個周期中輸出
bUartBusy = ON;
while
(bUartBusy == ON);
}
#ifdef
EVENPARITY
TXB=bEven &
0x1
;
//取1的個數和作為偶校驗結果位發送。
bUartBusy = ON;
while
(bUartBusy == ON);
#endif
TXB =
1
;
// 發送第一個串口停止位
bUartBusy = ON;
while
(bUartBusy == ON);
#ifdef
STOP2BITS
//如果定義2位停止位
bUartBusy = ON;
//發送第2個停止位
while
(bUartBusy == ON);
#endif
TR0 =
0
;
//定時器0結束計時
ET0 =
0
;
//禁能定時器0中斷
}
定時器Timer0的中斷服務中,僅僅完成標志設置,確保每個數據位發送的延遲時間準確。
void
Timer0ISR(
void
)
interrupt
1
using
1
{
EA=
0
;
bUartBusy=OFF;
EA=
1
;
}
關于定時器的工作模式和時間間隔設置如下:
void
uartInit(
void
)
{
AUXR |=
0x80
;
//Timer0為1T模式
TMOD &=
0xF0
;
//設置Timer0為模式0(16位自動重裝載)
//設置Timer0的計數器初值
TL0 = (
0xFFFF
- MCUFREQ / UARTBAUD) &
0xFF
;
TH0 = ((
0xFFFF
- MCUFREQ / UARTBAUD) >>
8
) &
0xFF
;
TR0 =
0
;
ET0 =
0
;
EA =
1
;
}
其中:AUXR 為特殊功能寄存器,地址為0x8e。
sfr
AUXR=
0x8E;
#define
MCUFREQ
11059200
//系統主頻為11.0592MHz
#define
UARTBAUD
115200
//串口通訊的波特率
此時,數據的波形變化如下:
取其中的一個字符分析如下:完整的字符幀包括8位數據位,1個起始位,1個偶校驗位,2個停止位。示意圖如下所示。
在數據接收時,在雙方的發送接收參數都協商好以后,通過對重復的停止位,校驗位進行確認,就可由大量數據中判定出數據的起始位等信息。否則,需要定義握手信息來確認是否通訊正常。
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1