假設有這么一種協議由以下內容構成:
1.資料幀起始位 2bytes AA DD
2.資料幀長度 2bytes 00 XX
3.資料域 長度可變 每4個位元組為一組 比如 0E 0F 00 65,0E代表溫度 0F代表攝氏度
4.校驗位 2bytes
目前就是要把資料域決議出來
Typedef struct
{
uint8_t frame_head[2];
uint8_t frame_length[2];
uint8_t frame_datafield[256];
uint8_t frame_checkbit[2];
} myselfprotocal;
首先串口1判斷 幀頭符不符合
if(g_tBspUart1.flag==1 && g_tBspUart1.pRxBuf[0]==AA && g_tBspUart1.pRxBuf[1]==DD)
memcpy(&myselfprotocal_t,& g_tBspUart1.pRxBuf, g_tBspUart1.rxLen);
資料域4個位元組為一組,假設有5組,請問我該怎么分別決議出來呢?比如0E 0F 00 65 0C 03 00 23 02 0A 00 23這樣的格式
謝謝各位
uj5u.com熱心網友回復:
你那兒有資料幀長度啊,所以你問的實際上是什么?uj5u.com熱心網友回復:
|start | Command | Data | CRC ||0xAA | 0xDD | 需要決議的部分 | |
----------------------------------------------------
意思是 怎么把frame_datafield[]這個陣列里的元素 按4個一組 4個一組 分別提取出來
uj5u.com熱心網友回復:
uint8_t * frame=...; //帶頭的全幀首地址uint8_t (*data)[4]=(uint8_t *[4])(frame+4);
short int len=(*(short int *)(frame+2)-4)/4; //假設幀長度包括頭不包括尾校驗
int i;
for(i=0;i<len;i++)
{
do_someting_on data[i];
}
uj5u.com熱心網友回復:
謝謝您的思路uj5u.com熱心網友回復:
2位元組的資料幀長度要注意高低位元組序,一般要用socket函式互相轉換:htons()、ntohs()
uj5u.com熱心網友回復:
您好,本人接觸編程時間不長,請問這串代碼怎么理解呢 謝謝
(uint8_t *[4])(frame+4);
就是(uint8_t *[4])這樣的表達方式沒有見過
以及(*(short int *)(frame+2)-4)
uj5u.com熱心網友回復:
就是各種轉換指標型別嘛,frame是指標,管1個位元組,frame+4也是。
把它強制轉換為uint8_t *[4]型別也就是指標變數data的型別,就是為了讓它變成管4個位元組的指標型別,用來給data指標賦值。
下面那個類似,多了一個解參考也就是取目標,但是沒有特意考慮位元組序,如果位元組序不對,就不能這樣寫。
uj5u.com熱心網友回復:
本來等著你說處理全幀的不如邊接收邊處理來得效率高呢。uj5u.com熱心網友回復:
雖然這個問題里不涉及區分大端小端 還是非常感謝您讓我知道了這兩個函式 挺實用的 謝謝!
uj5u.com熱心網友回復:
非常感謝您花費時間講解 我再去消化研究一下
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/268735.html
標籤:C語言
上一篇:c語言
