<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式開發中組包的過程和解析的過程一樣嗎

Dp1040 ? 來源:玩點嵌入式 ? 2023-08-08 09:12 ? 次閱讀

嵌入式產品開發中,我們經常會遇到兩個設備之間的通信、設備與服務器的通信、設備和上位機的通信等,很多時候通信協議都是自定義的,所以這就涉及到自定義協議的解析和組包問題。

比如針對下面的這樣一個協議:

幀頭1 幀頭2 字段1 字段2 校驗
固定值:0x55 固定值:0xAA 設備ID 電壓值 前面所有數據異或值
char char short float char
1字節 1字節 2字節 4字節 1字節

數據在發送時涉及到一個大小端的概念,大小端是針對多字節數據的傳輸,比如上述協議中字段1,假設兩字節內容為0x0001,先發送0x01后發送0x00,稱為小端模式;先發送0x00后發送0x01,稱為大端模式。

假設字段1內容為0x001,字段2內容為0x40533333(對應為3.3)

假設按照小端方式發送,下面是幀數據:

55 AA 01 00 33 33 53 40 ED

下面來看看如何解析:

若干年前,在第一次面對這種問題時,用的如下傻瓜式的代碼方式實現:

#include

intmain()
{
unsigned char Rxbuf[9]={0x55,0xAA,0x01,0x00,0x33,0x33,0x53,0x40,0xED};

short DeviceId;
floatVoltage;

unsigned char check=0;
int i;

for(i=0;i<8;i++)
????{
????????check?^=?Rxbuf[i];
????}

????if(Rxbuf[0]==0x55?&&?Rxbuf[1]==0xAA?&&?Rxbuf[8]==check?)
????{
????????DeviceId=(Rxbuf[3]<<8)|Rxbuf[2];
????????Voltage=?*((float?*)&Rxbuf[4]);

????????printf("DeviceId:%d
",DeviceId);
????????printf("Voltage:%f
",Voltage);
????}

????return?0;
}
9fcfbe42-3583-11ee-9e74-dac502259ad0.png

簡單來說就是硬來,按照數組的先后順序逐個重組解析,如果協議比較長,代碼里會充斥著很多的數組下標,一不小心就數錯了。而且如果更改協議的話,代碼要改動很多地方。

后來有人告訴我可以定義個結構體,然后使用memcpy函數直接復制過去就完事了。

#include
#include
#pragma pack(1)
struct RxFrame
{
unsigned char header1;
unsigned char header2;
short deviceId;
floatvoltage;
unsigned char check;
};


intmain()
{
unsigned char Rxbuf[9]={0x55,0xAA,0x01,0x00,0x33,0x33,0x53,0x40,0xED};

struct RxFrame RxData;

unsigned char check=0;
int i;

for(i=0;i<8;i++)
????{
????????check?^=?Rxbuf[i];
????}

????memcpy(&RxData,Rxbuf,sizeof(Rxbuf));

????if(Rxbuf[0]==0x55?&&?Rxbuf[1]==0xAA?&&?RxData.check==check?)
????{
????????printf("DeviceId:%d
",RxData.deviceId);
????????printf("Voltage:%f
",RxData.voltage);
????}

????return?0;
}

嗯,的確是方便了很多。不過,該方式僅適合小端傳輸方式。

再后來,又見到有人用如下代碼實現:

#include
#include"convert.h"

intmain()
{
unsigned char Rxbuf[9]={0x55,0xAA,0x01,0x00,0x33,0x33,0x53,0x40,0xED};

short DeviceId;
floatVoltage;

unsigned char check=0;
int i;
int index=0;

for(i=0;i<8;i++)
????{
????????check?^=?Rxbuf[i];
????}

????if(Rxbuf[0]==0x55?&&?Rxbuf[1]==0xAA?&&?Rxbuf[8]==check?)
????{
????????index?+=?2;
????????ByteToShort(Rxbuf,?&index,?&DeviceId);
????????ByteToFloat(Rxbuf,?&index,?&Voltage);

????????printf("DeviceId:%d
",DeviceId);
????????printf("Voltage:%f
",Voltage);
????}

????return?0;
}
其中convert.h如下:

#ifndef CONVERT_H
#define CONVERT_H

voidShortToByte(unsigned char*dest,int*index,short value);
voidFloatToByte(char*dest,int*index,floatvalue);

#endif//CONVERT_H
convert.c如下:
#include"convert.h"
#include
#include

static bool Endianflag=0;

void ByteToShort(const unsigned char*source,int*index,short*result)
{
int i,len=sizeof(short);
char p[len];
memset(p,0,len);

if(Endianflag==1)
{
for(i=0;i
該方法既可以支持小端模式,也可以支持大端模式,使用起來也是比較方便。

除了上述2個函數,完整的轉換包含以下函數,就是將Bytes轉換為不同的數據類型,以及將不同的數據類型轉換為Bytes。

#ifndef CONVERT_H
#define CONVERT_H

voidByteToShort(const unsigned char*source,int*index,short*result);
voidByteToInt(unsigned char*source,int*index,int*result);
voidByteToLong(char*source,int*index,long long*result);
voidByteToFloat(unsigned char*source,int*index,float*result);
voidByteToDouble(unsigned char*source,int*index,double*result);
voidByteToString(unsigned char*source,int*index,char*result,int length);


voidShortToByte(unsigned char*dest,int*index,short value);
voidIntToByte(char*dest,int*index,int value);
voidLongToByte(char*dest,int*index,long long value);
voidFloatToByte(char*dest,int*index,floatvalue);
voidDoubleToByte(unsigned char*dest,int*index,double value);
voidStringToByte(char*dest,int*index,int length,char*value);

#endif//CONVERT_H

組包的過程和解析的過程正好相反,這里不再贅述。你在開發中遇到這種問題時,又是如何處理的呢?歡迎留言討論!

責任編輯:彭菁

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5006

    文章

    18446

    瀏覽量

    292187
  • 通信協議
    +關注

    關注

    28

    文章

    774

    瀏覽量

    39963
  • 數據
    +關注

    關注

    8

    文章

    6550

    瀏覽量

    87869
  • 服務器
    +關注

    關注

    12

    文章

    8297

    瀏覽量

    83216
  • 嵌入式開發
    +關注

    關注

    18

    文章

    986

    瀏覽量

    47109

原文標題:嵌入式開發中,自定義協議的解析與組包

文章出處:【微信號:玩點嵌入式,微信公眾號:玩點嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入式開發就業前景怎么?

    嵌入式開發就業前景怎么?隨著科技的飛速發展,嵌入式開發在各個領域的應用越來越廣泛,因此嵌入式開發的就業前景也備受關注。今天將從智能家居、醫療設備、工業控制、汽車電子、航空航天等方面,
    發表于 06-07 14:51

    嵌入式開發入門之旅

    嵌入式開發這個技術新領域,讓學員領略嵌入式技術的魅力,使學員對嵌入式開發過程個大致的了解,了解嵌入式開發所需要的知識及學習方法,加強學員
    發表于 07-09 16:57

    嵌入式開發入門之旅

    、文件系統制作與移植、圖形化Linux應用程序的開發入門這幾個角度,將學員帶入嵌入式開發這個技術新領域,讓學員領略嵌入式技術的魅力,使學員對嵌入式開發過程
    發表于 07-10 15:59

    嵌入式開發

    本帖最后由 gk320830 于 2015-3-7 06:45 編輯 請問大家下,我是嵌入式開發的菜鳥枚,請問學習嵌入式開發過程
    發表于 12-04 22:37

    嵌入式開發教程之程序設計與開發維護

      干貨來了,本文創客學院嵌入式linux培訓講師和學員分享嵌入式程序設計和系統開發與維護的相關知識點。希望對學習嵌入式開發的學員有所幫助?! ?b class='flag-5'>嵌入
    發表于 05-26 14:59

    嵌入式開發要學什么?

      隨著智能硬件的迅速發展,越來越多的人把目光投向了嵌入式開發,想要更快進入嵌入式開發領域,先來了解嵌入式開發要學什么?  以下是學員總結的心得,具體
    發表于 09-06 16:21

    嵌入式開發要學什么

    [td] 最近遇到很多處于迷茫的新手,在糾結要不要去學嵌入式,主要問題在于嵌入式的門檻非常高,經驗少、或者非電子專業投身嵌入式行業能否發展下去?,F在
    發表于 01-18 06:36

    嵌入式開發過程中的硬件異常死機

    嵌入式開發過程中,當我們對于很多變量的使用理解不結合硬件便會使程序跑飛。這篇文章便分享了自己在實際項目中由于局部變量使用不當造成的硬件異常死機。
    發表于 08-05 08:33

    嵌入式軟件開發語言的相關資料推薦

    解析嵌入式軟件開發語言:嵌入式C編程在我們初學嵌入式開發的時候,總會出現個問題。那就是C語言和
    發表于 10-27 06:30

    淺析基于linux的嵌入式開發

    嵌入式開發的第三個階段,也是步入復雜的嵌入式系統開發的開始。之所以打算把自己每天的學習經過記錄下來,方面是為了做記錄方便隨時看,加深記憶,最重要的還是由于我自己怕自己在這個
    發表于 11-05 06:49

    嵌入式開發調試經驗分享

    嵌入式開發過程中點調試經驗嵌入式開發最麻煩的在現場調試過程中或實際運營過程中出現問題很難定位。我在實際
    發表于 11-05 08:15

    嵌入式開發過程中遇到scp Permission denied怎么解決

    嵌入式開發過程中,遇到scp Permission denied,將目標文件chmod 777也不起作用,其實需要修改ssh的配置。如下:sudo vim /etc/ssh/ssh_config將其中的PasswordAuthentication 的值給為yes即可。...
    發表于 11-08 09:17

    嵌入式開發過程中遇到的知識點記錄

    前言本篇主要是對嵌入式開發過程中遇到的些很小的知識點進行記錄,就像閱讀篇英語文章,碰見些不認識的,不熟悉的單詞,語法,查閱資料搞懂記錄下來,這些零碎的東西聚少成多,也是
    發表于 12-14 07:37

    嵌入式產品的研發過程是怎樣的

    嵌入式產品與普通電子產品一樣,在開發過程中需要遵循些基本過程,即從需求分析到總體設計,詳細設計到最終產品完成的
    發表于 12-17 08:18

    嵌入式開發自定義協議的解析相關案例分享

    1、嵌入式開發自定義協議的解析  在嵌入式產品開發
    發表于 10-27 17:01
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>