欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 13264|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

MCU串口異步通訊過(guò)程中的奇偶校驗(yàn)和停止位深入研究

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:91442 發(fā)表于 2015-10-29 12:46 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
在連續(xù)的高速異步通訊中,如果沒(méi)有作為握手用的信號(hào)位,那么如何辨識(shí)一個(gè)字符幀的開(kāi)始變成了難題。從一串連續(xù)的數(shù)字中找出字節(jié)的幀頭,然后正確的識(shí)別出要傳輸?shù)男畔ⅲ亲龆啻螄L試,并且通訊雙方約定好起始信息,方可正確傳輸信息。此時(shí),為了讓信號(hào)有較為明顯的辨識(shí)信息,增加奇偶校驗(yàn)位,以及加長(zhǎng)停止位的長(zhǎng)度,都是一個(gè)提高幀起始判定的一種方法。

在波特率為115200的設(shè)置下,如果采用N,8,1的標(biāo)準(zhǔn)設(shè)置,可以從下面的波形圖中看出,如果連續(xù)發(fā)送字符0x55,則停止位到下一個(gè)起始位之間的脈寬是11.12us, 而標(biāo)準(zhǔn)的數(shù)字位的脈寬是8.83us。如果在兩個(gè)數(shù)據(jù)的發(fā)送之間沒(méi)有其他延時(shí)信號(hào),則可能無(wú)法分辨出那一個(gè)位是一個(gè)字符幀的起始位,從而導(dǎo)致后續(xù)其它字符的幀錯(cuò)誤。這樣在使用軟件方法做串行數(shù)據(jù)接收時(shí),就會(huì)出錯(cuò)。


圖1,在波特率115200時(shí),標(biāo)準(zhǔn)位脈沖寬度為8.83us


圖2,在波特率115200時(shí),停止位到下一個(gè)起始位的寬度可能更小,這里是11.12us。


圖3,出現(xiàn)幀判別錯(cuò)誤的情形(這里是奇偶校驗(yàn)設(shè)置不正確導(dǎo)致)。

為了解決這個(gè)異常,可以通過(guò)加長(zhǎng)停止位的方法,提高軟件對(duì)起始位的識(shí)別幾率。因此上可以將常用的1個(gè)停止位,增加到1.5個(gè)或2個(gè)位長(zhǎng)度。對(duì)于長(zhǎng)線傳輸,為了檢查傳輸過(guò)程中信號(hào)是否受其他干擾而導(dǎo)致的翻轉(zhuǎn),又在停止位之前,插入奇偶校驗(yàn)位的方式,協(xié)議商定傳輸?shù)?的個(gè)數(shù)是奇數(shù)個(gè)或者偶數(shù)個(gè),然后通過(guò)插補(bǔ)的方式確定每幀的情況相同。這樣,如果在接收端發(fā)現(xiàn)幀錯(cuò)誤,可以及時(shí)檢查出來(lái)。

使用C51的發(fā)送程序:
sbit TXB = P3^1;
sbit RXB = P3^0;
bit bUartBusy; //串口正在使用的標(biāo)志
unsigned char bEven; //用來(lái)計(jì)算偶校驗(yàn)的和
#define ON 1
#define OFF 0

// #define EVENPARITY
//#define STOP2BITS

void SendChar(unsigned char c)
{
    unsigned char nCnt;
   
    TXB=0; //串口起始位開(kāi)始
    TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
    ET0 = 1; //使能定時(shí)器0中斷
    bUartBusy = ON;      
    //bUartBusy 在Timer0的服務(wù)程序中設(shè)置為OFF
    while(bUartBusy == ON); //維持當(dāng)前TXB的電平,直到下一次中斷到來(lái)。輸出一個(gè)位寬的數(shù)據(jù)。
    //由低位開(kāi)始,將數(shù)據(jù)通過(guò)串口輸出
   #ifdef EVENPARITY    //如果定義偶校驗(yàn)
   bEven=0;           //偶校驗(yàn)的初值為0.
   #endif
    for (nCnt = 0; nCnt < 8; nCnt++) {
        TXB =c & 0x01;  //輸出最低位
#ifdef EVENPARITY
        bEven = bEven + (c & 0x01); //偶校驗(yàn)計(jì)算,把所有的1加起來(lái)
#endif

        c >>= 1;  //右移一位,準(zhǔn)備在下個(gè)周期中輸出
        bUartBusy = ON;
       while(bUartBusy == ON);
    }
#ifdef EVENPARITY
    TXB=bEven & 0x1;   //取1的個(gè)數(shù)和作為偶校驗(yàn)結(jié)果位發(fā)送。
    bUartBusy = ON;
    while(bUartBusy == ON);
#endif
    TXB = 1; // 發(fā)送第一個(gè)串口停止位  
    bUartBusy = ON;
    while(bUartBusy == ON);
#ifdef STOP2BITS    //如果定義2位停止位
    bUartBusy = ON;         //發(fā)送第2個(gè)停止位
    while(bUartBusy == ON);
#endif
    TR0 = 0; //定時(shí)器0結(jié)束計(jì)時(shí)
    ET0 = 0; //禁能定時(shí)器0中斷   
}
定時(shí)器Timer0的中斷服務(wù)中,僅僅完成標(biāo)志設(shè)置,確保每個(gè)數(shù)據(jù)位發(fā)送的延遲時(shí)間準(zhǔn)確。
void Timer0ISR(void) interrupt 1 using 1
{
    EA=0;
    bUartBusy=OFF;
    EA=1;
}
關(guān)于定時(shí)器的工作模式和時(shí)間間隔設(shè)置如下:
void uartInit(void)
{
    AUXR |= 0x80; //Timer0為1T模式
    TMOD &= 0xF0; //設(shè)置Timer0為模式0(16位自動(dòng)重裝載)
    //設(shè)置Timer0的計(jì)數(shù)器初值
    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  //系統(tǒng)主頻為11.0592MHz
#define UARTBAUD 115200      //串口通訊的波特率

此時(shí),數(shù)據(jù)的波形變化如下:

取其中的一個(gè)字符分析如下:完整的字符幀包括8位數(shù)據(jù)位,1個(gè)起始位,1個(gè)偶校驗(yàn)位,2個(gè)停止位。示意圖如下所示。


在數(shù)據(jù)接收時(shí),在雙方的發(fā)送接收參數(shù)都協(xié)商好以后,通過(guò)對(duì)重復(fù)的停止位,校驗(yàn)位進(jìn)行確認(rèn),就可由大量數(shù)據(jù)中判定出數(shù)據(jù)的起始位等信息。否則,需要定義握手信息來(lái)確認(rèn)是否通訊正常。

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

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表