中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)通信協(xié)議處理

        單片機(jī)通信協(xié)議處理

        作者: 時(shí)間:2012-10-26 來源:網(wǎng)絡(luò) 收藏

        以下給出具體的實(shí)例。在這個(gè)系統(tǒng)中,串口的命令非常簡(jiǎn)單。所有的全部在串口中斷中進(jìn)行。數(shù)據(jù)包的格式如下:

        0x55, 0xAA, 0x7E, 0x12, 0xF0, 0x02, 0x23, 0x45, SUM, XOR, 0x0D

        其中0x55, 0xAA, 0x7E為數(shù)據(jù)幀的幀頭,0x0D為幀尾,0x12為設(shè)備的目的地址,0xF0為源地址,0x02為數(shù)據(jù)長(zhǎng)度,后面接著兩個(gè)數(shù)據(jù)0x23, 0x45,從目的地址開始結(jié)算累加、異或校驗(yàn)和,到數(shù)據(jù)的最后一位結(jié)束。

        解析的目的,首先判斷數(shù)據(jù)包的完整性,正確性,然后提取數(shù)據(jù)類型,數(shù)據(jù)等數(shù)據(jù),存放起來用于主程序。代碼如下:

        if(state_machine == 0) // 解析狀態(tài)機(jī)

        {

        if(rcvdat == 0x55) // 接收到幀頭第一個(gè)數(shù)據(jù)

        state_machine = 1;

        else

        state_machine = 0; // 狀態(tài)機(jī)復(fù)位

        }

        else if(state_machine == 1)

        {

        if(rcvdat == 0xAA) // 接收到幀頭第二個(gè)數(shù)據(jù)

        state_machine = 2;

        else

        state_machine = 0; // 狀態(tài)機(jī)復(fù)位

        }

        else if(state_machine == 2)

        {

        if(rcvdat == 0x7E) // 接收到幀頭第三個(gè)數(shù)據(jù)

        state_machine = 3;

        else

        state_machine = 0; // 狀態(tài)機(jī)復(fù)位

        }

        else if(state_machine == 3)

        {

        sumchkm = rcvdat; // 開始計(jì)算累加、異或校驗(yàn)和

        xorchkm = rcvdat;

        if(rcvdat == m_SrcAdr) // 判斷目的地址是否正確

        state_machine = 4;

        else

        state_machine = 0;

        }

        else if(state_machine == 4)

        {

        sumchkm += rcvdat;

        xorchkm ^= rcvdat;

        if(rcvdat == m_DstAdr) // 判斷源地址是否正確

        state_machine = 5;

        else

        state_machine = 0;

        }

        else if(state_machine == 5)

        {

        lencnt = 0; // 接收數(shù)據(jù)計(jì)數(shù)器

        rcvcount = rcvdat; // 接收數(shù)據(jù)長(zhǎng)度

        sumchkm += rcvdat;

        xorchkm ^= rcvdat;

        state_machine = 6;

        }

        else if(state _machine == 6 || state _machine == 7)

        {

        m_ucData[lencnt++] = rcvdat; // 數(shù)據(jù)保存

        sumchkm += rcvdat;

        xorchkm ^= rcvdat;

        if(lencnt == rcvcount) // 判斷數(shù)據(jù)是否接收完畢

        state_machine = 8;

        else

        state_machine = 7;

        }

        else if(state_machine == 8)

        {

        if(sumchkm == rcvdat) // 判斷累加和是否相等

        state_machine = 9;

        else

        state_machine = 0;

        }

        else if(state_machine == 9)

        {

        if(xorchkm == rcvdat) // 判斷異或校驗(yàn)和是否相等

        state_machine = 10;

        else

        state_machine = 0;

        }

        else if(state_machine == 10)

        {

        if(0x0D == rcvdat) // 判斷是否接收到幀尾結(jié)束符

        {

        retval = 0xaa; // 置標(biāo)志,表示一個(gè)數(shù)據(jù)包接收到

        }

        state_machine = 0; // 復(fù)位狀態(tài)機(jī)

        }

        此過程中,使用了一個(gè)變量state_machine作為協(xié)議狀態(tài)機(jī)的轉(zhuǎn)換狀態(tài),用于確定當(dāng)前字節(jié)處于一幀數(shù)據(jù)中的那個(gè)部位,同時(shí)在接收過程中自動(dòng)對(duì)接收數(shù)據(jù)進(jìn)行校驗(yàn)和,在數(shù)據(jù)包接收完的同時(shí)也進(jìn)行了校驗(yàn)的比較。因此當(dāng)幀尾結(jié)束符接收到的時(shí)候,則表示一幀數(shù)據(jù)已經(jīng)接收完畢,并且通過了校驗(yàn),關(guān)鍵數(shù)據(jù)也保存到了緩沖去中。主程序即可通過retval的標(biāo)志位來進(jìn)行協(xié)議的解析。

        接收過程中,只要哪一步收到的數(shù)據(jù)不是預(yù)期值,則直接將狀態(tài)機(jī)復(fù)位,用于下一幀數(shù)據(jù)的判斷,因此系統(tǒng)出現(xiàn)狀態(tài)死鎖的情況非常少,系統(tǒng)比較穩(wěn)定,如果出現(xiàn)丟失數(shù)據(jù)包的情況也可由上位機(jī)進(jìn)行命令的補(bǔ)發(fā),不過這種情況筆者還沒有碰到。

        對(duì)于主程序中進(jìn)行協(xié)議處理的過程與此類似,主程序循環(huán)中不斷的讀取串口緩沖區(qū)的數(shù)據(jù),此數(shù)據(jù)即參與到主循環(huán)中的協(xié)議處理過程中,代碼與上面所述完全一樣。



        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉