0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

結(jié)構(gòu)體嵌入共聯(lián)體在協(xié)議解析中的技術(shù)性操作過(guò)程

嵌入式情報(bào)局 ? 來(lái)源:最后一個(gè)bug ? 2024-02-25 15:00 ? 次閱讀

1、正文部分

1

話題引出

技術(shù)交流群一個(gè)小哥貼出了如下圖片 :

73dfcd60-d310-11ee-a297-92fbcf53809c.png ? 73f2f610-d310-11ee-a297-92fbcf53809c.png

問(wèn)到了共聯(lián)體類型強(qiáng)制轉(zhuǎn)化的問(wèn)題,當(dāng)時(shí)bug菌點(diǎn)開看到這幾行代碼便產(chǎn)生了莫名的親切感,或許這些就是C語(yǔ)言的魅力所在吧。

其實(shí)這種操作在通信協(xié)議中拆包、解包是非常常見的,但是筆者也是在參加工作以后在部門的代碼中g(shù)et到,所以這里整理分享給各位。

2

操作解析

有認(rèn)真閱讀過(guò)筆者公眾號(hào)文章的小伙伴,應(yīng)該在其他文章中也看到過(guò)這種操作,不過(guò)比較分散,今天抽出來(lái)再好好聊聊!

1

buff直接轉(zhuǎn)結(jié)構(gòu)體

74178ab6-d310-11ee-a297-92fbcf53809c.png

上圖是簡(jiǎn)單的協(xié)議包,包括幀頭,長(zhǎng)度和數(shù)據(jù)部分,在通信數(shù)據(jù)接收或者發(fā)送末端其都位于字節(jié)流中,比如UART通信,最后都是放到Sendbuff[N]或者RecBuff[N],然后發(fā)送出去。

如果你打包好了結(jié)構(gòu)體,然后一個(gè)個(gè)填充byte到發(fā)送或者接受buff,著實(shí)有點(diǎn)麻煩,然而通過(guò)結(jié)構(gòu)體指針強(qiáng)制類型轉(zhuǎn)換為uint8_t *pSendBuff;然后在進(jìn)行字節(jié)流發(fā)送,那就簡(jiǎn)潔很多了。

當(dāng)然在此過(guò)程中你還要注意字節(jié)序、對(duì)齊等等,在往期的文章中bug菌都有講到,模擬此過(guò)程參考下面代碼。

參考示例:

#include
#include

#pragmapack(1)
typedefstruct_tag_Pack
{
intHead;
intLen;
charData[2];
}sPack;

intmain(intargc,char*argv[]){
sPackstSendPack;
sPack*pstRevPack=NULL;
unsignedchar*SendBuff=NULL;
unsignedcharRevBuff[20]={0};
intcnt=0;

//模擬封包
stSendPack.Head=0xFF;
stSendPack.Len=0x08;
stSendPack.Data[0]=0x1;
stSendPack.Data[1]=0x2;

//模擬發(fā)送包
SendBuff=(unsignedchar*)(&stSendPack);

printf("SendData:");
for(cnt=0;cntHead);
printf("pstRevPack.Len=0x%X
",pstRevPack->Len);
printf("pstRevPack.Data[0]=0x%X
",pstRevPack->Data[0]);
printf("pstRevPack.Data[1]=0x%X
",pstRevPack->Data[1]);

printf("
歡迎關(guān)注公眾號(hào):最后一個(gè)bug
");
return0;
}

運(yùn)行結(jié)果:

74285774-d310-11ee-a297-92fbcf53809c.png

2

buff直接轉(zhuǎn)結(jié)構(gòu)共聯(lián)體

743dc596-d310-11ee-a297-92fbcf53809c.png

上一節(jié)我們談到了接受和發(fā)送的buff直接轉(zhuǎn)結(jié)構(gòu)體,然后進(jìn)行解包處理,而交流群里面圖片中是轉(zhuǎn)共聯(lián)體,可以說(shuō)這樣的數(shù)據(jù)結(jié)構(gòu)結(jié)合是非常完美的。

buff轉(zhuǎn)結(jié)構(gòu)體類型,就必須buff字節(jié)流里的格式與結(jié)構(gòu)體一致,才能正確的解析,而共聯(lián)體是一種復(fù)合類型結(jié)構(gòu),可以存在多種形式的數(shù)據(jù)提取,這樣就可以帶來(lái)更多的靈活度,下面代碼在操作一波。

參考示例:

#include
#include

#pragmapack(1)
typedefstruct_tag_PackType1
{
intHead;
intLen;
charData[2];
}sPackType1;

typedefstruct_tag_PackType2
{
intHead;
intLen;
intData[2];
}sPackType2;

typedefstruct_tag_PackType3
{
intHead;
intLen;
floatData[2];
}sPackType3;

//結(jié)構(gòu)共聯(lián)體
typedefunion_tag_PackType
{
sPackType1stPackType1;
sPackType2stPackType2;
sPackType3stPackType3;
}uPackType;

//不同結(jié)構(gòu)體類型的解析函數(shù)
voidParsePackType1(uPackType*punPackType)
{
punPackType->stPackType1.Head=0xF1;
//you do something!
}

voidParsePackType2(uPackType*punPackType)
{
punPackType->stPackType2.Head=0xF2;
//you do something!
}

voidParsePackType3(uPackType*punPackType)
{
punPackType->stPackType3.Head=0xF3;
//you do something!
}
/******************************************
*Fuction:Buff轉(zhuǎn)結(jié)構(gòu)共聯(lián)體
*Author:(公眾號(hào):最后一個(gè)bug)
*****************************************/
intmain(intargc,char*argv[]){

uPackType*punPackType;
unsignedcharRevBuff[20]={0};

//通信字節(jié)流接受到RevBuff以后強(qiáng)轉(zhuǎn)
punPackType=(uPackType*)RevBuff;

//根據(jù)自身需要,不同的解析函數(shù),統(tǒng)一傳遞共聯(lián)體即可
ParsePackType1(punPackType);
ParsePackType2(punPackType);
ParsePackType3(punPackType);

printf("
歡迎關(guān)注公眾號(hào):最后一個(gè)bug
");
return0;
}

以上就是今天的全部?jī)?nèi)容,enjoy!





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7581

    瀏覽量

    135652
  • uart通信
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    6994

原文標(biāo)題:結(jié)構(gòu)體嵌入共聯(lián)體在協(xié)議解析中的技術(shù)性操作~

文章出處:【微信號(hào):嵌入式情報(bào)局,微信公眾號(hào):嵌入式情報(bào)局】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    手動(dòng)移液器的使用操作過(guò)程

    手動(dòng)移液器的使用操作過(guò)程  手動(dòng)移液器常見于臨床試驗(yàn)和實(shí)驗(yàn)室試驗(yàn),不同類型的移液器操作過(guò)程也有所不同,下面具體的解析一下。  一、使用方法:  1.根據(jù)所需取液量選擇相應(yīng)移液器及吸液
    發(fā)表于 11-20 11:51

    電路板手工焊接操作過(guò)程

    `哪位大神可以分享電路板手工焊接的操作過(guò)程嗎?`
    發(fā)表于 02-29 15:14

    求ATmega168看門狗復(fù)位的具體操作過(guò)程?

    ATmega168看門狗復(fù)位的具體操作過(guò)程
    發(fā)表于 11-18 07:17

    千萬(wàn)注意!纖薄器件操作過(guò)程中損壞不得

    千萬(wàn)注意!纖薄器件操作過(guò)程中損壞不得
    發(fā)表于 04-29 06:29

    怎樣去操作FTS-300光纜普查儀?操作過(guò)程中有哪些常見問(wèn)題?

    FTS-300光纜普查儀的測(cè)試原理FTS-300光纜普查儀的功能應(yīng)用范圍怎樣去操作FTS-300光纜普查儀?操作過(guò)程中有哪些常見問(wèn)題?
    發(fā)表于 05-06 09:42

    C語(yǔ)言的平臺(tái)操作過(guò)程

    兩種學(xué)習(xí)C語(yǔ)言的平臺(tái)操作過(guò)程,在后續(xù)內(nèi)容學(xué)習(xí)需要熟練應(yīng)用。這兩種方式分別為:keil c51編程軟件+硬件調(diào)試平臺(tái)臺(tái),,keilkeil c51c51編程軟件編程軟件+ proteusproteus軟件...
    發(fā)表于 07-20 06:19

    STM32內(nèi)部FLASH操作過(guò)程

    一般說(shuō)STM32內(nèi)部FLASH就是指主存儲(chǔ)器區(qū)域?qū)憙?nèi)部FLASH操作過(guò)程解鎖在對(duì)FLASH寫數(shù)據(jù)之前,需要先給解鎖,因?yàn)樾酒瑸榱朔乐拐`操作修改應(yīng)用程序,復(fù)位之后會(huì)給控制寄存器FLASH_CR上鎖(1
    發(fā)表于 12-09 06:37

    GPIO輸入完成按鍵掃描的操作過(guò)程是怎樣的

    GPIO輸入完成按鍵掃描的操作過(guò)程是怎樣的
    發(fā)表于 02-08 07:29

    RT-Thread操作系統(tǒng)從開機(jī)到關(guān)機(jī)的操作過(guò)程是怎樣的?

    RT-Thread操作系統(tǒng)從開機(jī)到關(guān)機(jī)的操作過(guò)程是怎樣的?
    發(fā)表于 02-15 07:43

    無(wú)鉛焊接在操作過(guò)程中的常見問(wèn)題

    無(wú)鉛焊接在操作過(guò)程中的常見問(wèn)題目前,電子制造正處于從有鉛向無(wú)鉛焊接過(guò)渡的特殊階段,無(wú)論從環(huán)保、立法、市場(chǎng)競(jìng)爭(zhēng)和產(chǎn)品可靠等方面來(lái)看,無(wú)鉛
    發(fā)表于 04-07 17:09 ?1049次閱讀

    心電監(jiān)護(hù)儀操作過(guò)程

    心電監(jiān)護(hù)儀是醫(yī)院實(shí)用的精密醫(yī)學(xué)儀器,能同時(shí)監(jiān)護(hù)病人的動(dòng)態(tài)心電圖形、呼吸、體溫、等生理參數(shù)。這里提供了心電監(jiān)護(hù)儀操作過(guò)程使用維護(hù)。
    發(fā)表于 12-21 17:36 ?2.1w次閱讀
    心電監(jiān)護(hù)儀<b class='flag-5'>操作過(guò)程</b>

    關(guān)于SMT貼片機(jī)操作過(guò)程中的注意事項(xiàng)

    SMT貼片機(jī)操作過(guò)程中的注意事項(xiàng) SMT貼片機(jī)是SMT整線線最關(guān)鍵、最核心的設(shè)備,貼片機(jī)是否正常工作直接影響貼片廠的產(chǎn)線運(yùn)轉(zhuǎn)情況,因此平時(shí)的生產(chǎn)過(guò)程中,必須要勤加保養(yǎng),讓貼片機(jī)發(fā)揮
    發(fā)表于 07-07 15:11 ?4261次閱讀

    FPGA應(yīng)用中部分重配置的操作過(guò)程

    Partial Reconfiguration(部分重配置)現(xiàn)在的FPGA應(yīng)用中越來(lái)越常見,我們這次的教程以Project模式為例來(lái)說(shuō)明部分重配置的操作過(guò)程。
    的頭像 發(fā)表于 07-05 15:28 ?3570次閱讀
    FPGA應(yīng)用中部分重配置的<b class='flag-5'>操作過(guò)程</b>

    在線快速修復(fù)終聚釜攪拌器軸磨損的現(xiàn)場(chǎng)操作過(guò)程

    在線快速修復(fù)終聚釜攪拌器軸磨損的現(xiàn)場(chǎng)操作過(guò)程
    發(fā)表于 12-06 15:17 ?5次下載

    磐石測(cè)控:深圳扭轉(zhuǎn)試驗(yàn)機(jī)操作過(guò)程是什么樣的?

    磐石測(cè)控:深圳扭轉(zhuǎn)試驗(yàn)機(jī)操作過(guò)程是什么樣的?
    的頭像 發(fā)表于 10-20 11:17 ?622次閱讀
    磐石測(cè)控:深圳扭轉(zhuǎn)試驗(yàn)機(jī)<b class='flag-5'>操作過(guò)程</b>是什么樣的?