嵌入式開發(fā)中自定義協(xié)議的解析與組包
時(shí)間:2021-10-19 16:10:37
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]在嵌入式產(chǎn)品開發(fā)中,經(jīng)常會(huì)遇到兩個(gè)設(shè)備之間的通信、設(shè)備與服務(wù)器的通信、設(shè)備和上位機(jī)的通信等,很多時(shí)候通信協(xié)議都是自定義的,所以就涉及到自定義協(xié)議的解析和組包問題。比如針對(duì)下面的這樣一個(gè)協(xié)議:幀頭1幀頭2字段1字段2校驗(yàn)固定值:0x55固定值:0xAA設(shè)備ID電壓值前面所有數(shù)據(jù)異或...
在嵌入式產(chǎn)品開發(fā)中,經(jīng)常會(huì)遇到兩個(gè)設(shè)備之間的通信、設(shè)備與服務(wù)器的通信、設(shè)備和上位機(jī)的通信等,很多時(shí)候通信協(xié)議都是自定義的,所以就涉及到自定義協(xié)議的解析和組包問題。比如針對(duì)下面的這樣一個(gè)協(xié)議:
數(shù)據(jù)在發(fā)送時(shí)涉及到一個(gè)大小端的概念,大小端是針對(duì)多字節(jié)數(shù)據(jù)的傳輸,比如上述協(xié)議中字段1,假設(shè)兩字節(jié)內(nèi)容為0x0001,先發(fā)送0x01后發(fā)送0x00,稱為小端模式;先發(fā)送0x00后發(fā)送0x01,稱為大端模式。假設(shè)字段1內(nèi)容為0x001,字段2內(nèi)容為0x40533333?(對(duì)應(yīng)為3.3)
假設(shè)按照小端方式發(fā)送,下面是幀數(shù)據(jù):55 AA 01 00 33 33 53 40 ED下面來看看如何解析,若干年前,在第一次面對(duì)這種問題時(shí),用的如下傻瓜式的代碼方式實(shí)現(xiàn):
幀頭1 | 幀頭2 | 字段1 | 字段2 | 校驗(yàn) |
---|---|---|---|---|
固定值:0x55 | 固定值:0xAA | 設(shè)備ID | 電壓值 | 前面所有數(shù)據(jù)異或值 |
char | char | short | float | char |
1字節(jié) | 1字節(jié) | 2字節(jié) | 4字節(jié) | 1字節(jié) |
假設(shè)按照小端方式發(fā)送,下面是幀數(shù)據(jù):55 AA 01 00 33 33 53 40 ED下面來看看如何解析,若干年前,在第一次面對(duì)這種問題時(shí),用的如下傻瓜式的代碼方式實(shí)現(xiàn):
#include?
int?main()
{
????unsigned?char?Rxbuf[9]?=?{0x55,0xAA,0x01,0x00,0x33,0x33,0x53,0x40,0xED};
????short?DeviceId;
????float?Voltage;
????unsigned?char?check?=?0;
????int?i;
????for(i=0;i<8;i )
????{
????????check?^=?Rxbuf[i];
????}
????if(Rxbuf[0]==0x55?