<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

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

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

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

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

{

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

state_machine = 1;

else

state_machine = 0; // 狀態(tài)機復位

}

else if(state_machine == 1)

{

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

state_machine = 2;

else

state_machine = 0; // 狀態(tài)機復位

}

else if(state_machine == 2)

{

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

state_machine = 3;

else

state_machine = 0; // 狀態(tài)機復位

}

else if(state_machine == 3)

{

sumchkm = rcvdat; // 開(kāi)始計算累加、異或校驗和

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; // 接收數據計數器

rcvcount = rcvdat; // 接收數據長(cháng)度

sumchkm += rcvdat;

xorchkm ^= rcvdat;

state_machine = 6;

}

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

{

m_ucData[lencnt++] = rcvdat; // 數據保存

sumchkm += rcvdat;

xorchkm ^= rcvdat;

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

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) // 判斷異或校驗和是否相等

state_machine = 10;

else

state_machine = 0;

}

else if(state_machine == 10)

{

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

{

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

}

state_machine = 0; // 復位狀態(tài)機

}

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

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

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



關(guān)鍵詞: 處理 協(xié)議 通信 單片機

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>