色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

責任編輯:彭菁

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

    關注

    5086

    文章

    19140

    瀏覽量

    305863
  • 通信協議
    +關注

    關注

    28

    文章

    887

    瀏覽量

    40324
  • 數據
    +關注

    關注

    8

    文章

    7067

    瀏覽量

    89130
  • 服務器
    +關注

    關注

    12

    文章

    9206

    瀏覽量

    85562
  • 嵌入式開發
    +關注

    關注

    18

    文章

    1031

    瀏覽量

    47599

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

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

收藏 人收藏

    評論

    相關推薦

    嵌入式開發linux awk命令深度詳解

    在我們初學嵌入式開發的時候,總會出現個問題。那就是C語言和嵌入式C編程有什么區別?而嵌入式工程師般都會告訴你,其區別在于
    的頭像 發表于 09-20 09:58 ?4237次閱讀

    嵌入式開發入門之旅

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

    嵌入式開發入門之旅

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

    淺析基于linux的嵌入式開發

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

    嵌入式開發調試經驗分享

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

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

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

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

    1、嵌入式開發自定義協議的解析  在嵌入式產品開發
    發表于 10-27 17:01

    嵌入式開發

    嵌入式開發就是指在嵌入式操作系統下進行開發嵌入式Linux是以Linux為基礎的嵌入式作業系統。這里提供了
    發表于 12-20 13:21
    <b class='flag-5'>嵌入式開發</b>

    嵌入式開發語言有哪些_最全面嵌入式開發語言概述

    嵌入式開發語言有哪些?嵌入式開發的入門門檻還是比較高的,不僅要懂較底層軟件,對軟件專業水平要求較高,而且必須懂得硬件的工作原理,嵌入式系統應用越來越廣泛,目前,在嵌入式系統
    發表于 01-29 14:47 ?9842次閱讀
    <b class='flag-5'>嵌入式開發</b>語言有哪些_最全面<b class='flag-5'>嵌入式開發</b>語言概述

    嵌入式開發):嵌入式開發新手入門

    本篇文章整理下嵌入式開發些入門的基礎技能,都是根據以往的工程經驗整理,適用于之前沒做過嵌入式開發的新手。嵌入式開發流程般如下,
    發表于 10-14 10:58 ?79次下載
    <b class='flag-5'>嵌入式開發</b>(<b class='flag-5'>一</b>):<b class='flag-5'>嵌入式開發</b>新手入門

    嵌入式開發前景怎么嵌入式開發有哪些優勢?

    前景到底怎么呢?具備哪些優勢呢?起了解下。對于嵌入式開發行業來說市場上開始有比較大的需求了,但是面臨著問題就是市場上嵌入式行業的人才缺
    發表于 10-20 14:50 ?2次下載
    <b class='flag-5'>嵌入式開發</b>前景怎么<b class='flag-5'>樣</b>?<b class='flag-5'>嵌入式開發</b>有哪些優勢?

    嵌入式開發般流程

    主流的嵌入式平臺有三種:ARM平臺、DSP平臺和FPGA平臺。嵌入式產品,與普通電子產品一樣開發過程都需要遵循些基本的流程,都是
    發表于 10-21 10:36 ?4次下載
    <b class='flag-5'>嵌入式開發</b><b class='flag-5'>一</b>般流程

    嵌入式開發培訓怎么嵌入式開發培訓多少錢

    嵌入式人才的工作環境與發展前景也有優勢。想學習嵌入式開發培訓怎么?可以學好嗎?如果你想進入嵌入式開發培訓,那么你現在就可以去找個靠譜的
    發表于 11-02 18:06 ?12次下載
    <b class='flag-5'>嵌入式開發</b>培訓怎么<b class='flag-5'>樣</b>?<b class='flag-5'>嵌入式開發</b>培訓多少錢

    嵌入式開發過程中點調試經驗

    嵌入式開發過程中點調試經驗嵌入式開發最麻煩的在現場調試過程中或實際運營過程中出現問題很難定位。我在實際
    發表于 11-02 18:06 ?15次下載
    <b class='flag-5'>嵌入式開發過程中</b>的<b class='flag-5'>一</b>點調試經驗

    嵌入式開發前景怎么

    嵌入式開發前景非常廣闊,這主要得益于物聯網、人工智能、大數據等技術的快速發展,以及嵌入式系統在各個領域的廣泛應用。以下是對嵌入式開發前景的詳細分析
    的頭像 發表于 07-10 09:00 ?2751次閱讀
    <b class='flag-5'>嵌入式開發</b>前景怎么<b class='flag-5'>樣</b>?
    主站蜘蛛池模板: 久久无码AV亚洲精品色午夜麻豆| 四川少妇大战4黑人| 亚洲国产综合人成综合网站00| 国产欧美精品国产国产专区| 胸大的姑娘中文字幕视频| 精品国产高清自在线看| 91交换论坛| 色欲AV精品人妻一区二区麻豆| 国产午夜电影在线观看不卡| 国产精品无码人妻99999| 亚洲国产在线精品国偷产拍| 精品国产一区二区三区久久影院 | 国产成人精品自拍| 亚洲精品久久久无码| 伦理电影v男人天堂| 电影日本妻子| 手机看片国产免费| 久久精品AV麻豆| 成年妇女免费播放| 亚洲视频区| 日本午夜精品理论片A级APP发布| 精品视频在线播放| 岛国片在线看| 4455永久在线毛片观看| 午夜福利影院私人爽爽| 男女床上黄色| 国产在线成人一区二区三区| 99久久国产综合精品| 亚洲AV久久久噜噜噜久久| 年轻的老师5理伦片| 狠狠人妻久久久久久综合九色| 扒开女生尿口| 123成人站| 亚洲国产成人久久精品影视| 人人碰在线视频| 毛片网站网址| 精品精品国产yyy5857香蕉| 丰满饥渴老太性hd| 99久久精品免费看国产一区二区| 亚洲精品久久99蜜芽尤物TV| 日韩一本在线|