久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12704|回復: 0
打印 上一主題 下一主題
收起左側

MCU串口異步通訊過程中的奇偶校驗和停止位深入研究

[復制鏈接]
跳轉到指定樓層
樓主
ID:91442 發表于 2015-10-29 12:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在連續的高速異步通訊中,如果沒有作為握手用的信號位,那么如何辨識一個字符幀的開始變成了難題。從一串連續的數字中找出字節的幀頭,然后正確的識別出要傳輸的信息,除非做多次嘗試,并且通訊雙方約定好起始信息,方可正確傳輸信息。此時,為了讓信號有較為明顯的辨識信息,增加奇偶校驗位,以及加長停止位的長度,都是一個提高幀起始判定的一種方法。

在波特率為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個停止位。示意圖如下所示。


在數據接收時,在雙方的發送接收參數都協商好以后,通過對重復的停止位,校驗位進行確認,就可由大量數據中判定出數據的起始位等信息。否則,需要定義握手信息來確認是否通訊正常。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲人免费视频 | 久久久日韩精品一区二区三区 | 日韩电影免费观看中文字幕 | 亚洲第一区久久 | 亚洲综合二区 | 日韩视频一区二区在线 | 波多野结衣一区二区三区在线观看 | 在线免费观看黄色 | 亚洲视频中文字幕 | 国产精品亚洲综合 | 岛国av在线免费观看 | 亚洲午夜网 | 国产高清免费在线 | 九九精品在线 | 日本成人三级电影 | 欧美精品在线一区 | 欧美一区二区在线 | 日韩中出 | 在线观看av网站永久 | 天堂一区在线 | 成人午夜免费网站 | 99视频在线免费观看 | 久久精品国产一区二区三区不卡 | 久久大 | 久久久久中文字幕 | 午夜精品一区二区三区在线视频 | 日本精品免费 | 一级a爱片久久毛片 | 欧美人妖网站 | 99中文字幕 | 欧美一区二区在线 | 久久精品久久久 | av中文在线播放 | 一区二区三区四区国产精品 | 久久99精品久久久久久秒播九色 | 日本精品久久久久久久 | 色www精品视频在线观看 | 亚洲性视频网站 | www.日韩高清 | 亚洲一区二区视频在线观看 | 啪啪毛片 |