91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

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

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

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

Dp1040 ? 來源:玩點(diǎn)嵌入式 ? 2023-08-08 09:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式產(chǎn)品開發(fā)中,我們經(jīng)常會(huì)遇到兩個(gè)設(shè)備之間的通信、設(shè)備與服務(wù)器的通信、設(shè)備和上位機(jī)的通信等,很多時(shí)候通信協(xié)議都是自定義的,所以這就涉及到自定義協(xié)議的解析和組包問題。

比如針對下面的這樣一個(gè)協(xié)議:

幀頭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ù)據(jù)在發(fā)送時(shí)涉及到一個(gè)大小端的概念,大小端是針對多字節(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(對應(yīng)為3.3)

假設(shè)按照小端方式發(fā)送,下面是幀數(shù)據(jù):

55 AA 01 00 33 33 53 40 ED

下面來看看如何解析:

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

#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

簡單來說就是硬來,按照數(shù)組的先后順序逐個(gè)重組解析,如果協(xié)議比較長,代碼里會(huì)充斥著很多的數(shù)組下標(biāo),一不小心就數(shù)錯(cuò)了。而且如果更改協(xié)議的話,代碼要改動(dòng)很多地方。

后來有人告訴我可以定義個(gè)結(jié)構(gòu)體,然后使用memcpy函數(shù)直接復(fù)制過去就完事了。

#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;
}

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

再后來,又見到有人用如下代碼實(shí)現(xiàn):

#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個(gè)函數(shù),完整的轉(zhuǎn)換包含以下函數(shù),就是將Bytes轉(zhuǎn)換為不同的數(shù)據(jù)類型,以及將不同的數(shù)據(jù)類型轉(zhuǎn)換為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

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

責(zé)任編輯:彭菁

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

    關(guān)注

    5150

    文章

    19659

    瀏覽量

    317369
  • 通信協(xié)議
    +關(guān)注

    關(guān)注

    28

    文章

    1033

    瀏覽量

    41154
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7255

    瀏覽量

    91816
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    13

    文章

    9791

    瀏覽量

    87923
  • 嵌入式開發(fā)
    +關(guān)注

    關(guān)注

    18

    文章

    1075

    瀏覽量

    48850

原文標(biāo)題:嵌入式開發(fā)中,自定義協(xié)議的解析與組包

文章出處:【微信號(hào):玩點(diǎn)嵌入式,微信公眾號(hào):玩點(diǎn)嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式開發(fā)linux awk命令深度詳解

    在我們初學(xué)嵌入式開發(fā)的時(shí)候,總會(huì)出現(xiàn)個(gè)問題。那就是C語言和嵌入式C編程有什么區(qū)別?而嵌入式工程師般都會(huì)告訴你,其區(qū)別在于
    的頭像 發(fā)表于 09-20 09:58 ?4422次閱讀

    嵌入式開發(fā)入門之旅

    嵌入式開發(fā)這個(gè)技術(shù)新領(lǐng)域,讓學(xué)員領(lǐng)略嵌入式技術(shù)的魅力,使學(xué)員對嵌入式開發(fā)過程個(gè)大致的了解,了解嵌入式開發(fā)所需要的知識(shí)及學(xué)習(xí)方法,加強(qiáng)學(xué)員
    發(fā)表于 07-09 16:57

    淺析基于linux的嵌入式開發(fā)

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

    嵌入式開發(fā)調(diào)試經(jīng)驗(yàn)分享

    嵌入式開發(fā)過程中點(diǎn)調(diào)試經(jīng)驗(yàn)嵌入式開發(fā)最麻煩的在現(xiàn)場調(diào)試過程中或?qū)嶋H運(yùn)營過程中出現(xiàn)問題很難定位。我在實(shí)際
    發(fā)表于 11-05 08:15

    嵌入式產(chǎn)品的研發(fā)過程是怎樣的

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

    嵌入式開發(fā)自定義協(xié)議的解析相關(guān)案例分享

    1、嵌入式開發(fā)自定義協(xié)議的解析  在嵌入式產(chǎn)品開發(fā)
    發(fā)表于 10-27 17:01

    嵌入式開發(fā)

    嵌入式開發(fā)就是指在嵌入式操作系統(tǒng)下進(jìn)行開發(fā)嵌入式Linux是以Linux為基礎(chǔ)的嵌入式作業(yè)系統(tǒng)。這里提供了
    發(fā)表于 12-20 13:21
    <b class='flag-5'>嵌入式開發(fā)</b>

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

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

    嵌入式開發(fā)):嵌入式開發(fā)新手入門

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

    嵌入式開發(fā)前景怎么嵌入式開發(fā)有哪些優(yōu)勢?

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

    嵌入式開發(fā)般流程

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

    嵌入式開發(fā)資料免費(fèi)分享

    嵌入式開發(fā)資料免費(fèi)分享嵌入式工程師經(jīng)驗(yàn)分享:如何學(xué)習(xí)嵌入式開發(fā)截取文檔部分學(xué)習(xí)嵌入式工程師經(jīng)驗(yàn)分享的資料分享給大家,文檔上從、嵌入式系統(tǒng)的概
    發(fā)表于 10-21 11:07 ?47次下載
    <b class='flag-5'>嵌入式開發(fā)</b>資料免費(fèi)分享

    嵌入式開發(fā)培訓(xùn)怎么嵌入式開發(fā)培訓(xùn)多少錢

    嵌入式人才的工作環(huán)境與發(fā)展前景也有優(yōu)勢。想學(xué)習(xí)嵌入式開發(fā)培訓(xùn)怎么?可以學(xué)好嗎?如果你想進(jìn)入嵌入式開發(fā)培訓(xùn),那么你現(xiàn)在就可以去找個(gè)靠譜的
    發(fā)表于 11-02 18:06 ?12次下載
    <b class='flag-5'>嵌入式開發(fā)</b>培訓(xùn)怎么<b class='flag-5'>樣</b>?<b class='flag-5'>嵌入式開發(fā)</b>培訓(xùn)多少錢

    嵌入式開發(fā)過程中點(diǎn)調(diào)試經(jīng)驗(yàn)

    嵌入式開發(fā)過程中點(diǎn)調(diào)試經(jīng)驗(yàn)嵌入式開發(fā)最麻煩的在現(xiàn)場調(diào)試過程中或?qū)嶋H運(yùn)營過程中出現(xiàn)問題很難定位。我在實(shí)際
    發(fā)表于 11-02 18:06 ?15次下載
    <b class='flag-5'>嵌入式開發(fā)過程中</b>的<b class='flag-5'>一</b>點(diǎn)調(diào)試經(jīng)驗(yàn)

    嵌入式開發(fā)前景怎么

    嵌入式開發(fā)前景非常廣闊,這主要得益于物聯(lián)網(wǎng)、人工智能、大數(shù)據(jù)等技術(shù)的快速發(fā)展,以及嵌入式系統(tǒng)在各個(gè)領(lǐng)域的廣泛應(yīng)用。以下是對嵌入式開發(fā)前景的詳細(xì)分析
    的頭像 發(fā)表于 07-10 09:00 ?4446次閱讀
    <b class='flag-5'>嵌入式開發(fā)</b>前景怎么<b class='flag-5'>樣</b>?
    主站蜘蛛池模板: 影音先锋午夜资源网站 | 亚洲综合色色图 | 天天曰天天干 | 国产成人精品三级在线 | a成人| 美女拍拍拍免费视频观看 | 亚洲综合成人网 | 欧美色图亚洲综合 | 色婷婷综合和线在线 | 娇妻被黑人蹂躏 | 欧美色淫 | 很狠操| 天天操天天干天天摸 | 欧洲性freefree大白屁股 | 欧美午夜视频在线观看 | 夜夜爽天天干 | 色老头视频在线观看 | 国产又色又爽又黄的网站在线一级 | 天天干天天舔天天操 | 黄录像欧美片在线观看 | 男人天堂网在线观看 | 中文字幕在线观看第一页 | 在线亚洲精品中文字幕美乳 | 天天看片国产 | 成人免费视频一区二区三区 | 国产在线精品一区二区夜色 | 寄宿日记免费看 | 5060精品国产福利午夜 | 伊人网综合在线 | 成人五级毛片免费播放 | 在线天堂中文字幕 | 依依成人精品无v国产 | 国产精品黄网站免费进入 | 色视频在线免费观看 | 国产盗摄女子私密保健视频 | 最新人妖shemaletube人妖 最新日本免费一区二区三区中文 | 日本aaaaa特黄毛片 | 在线免费视频观看 | 欧美三级成人 | 天天舔天天射天天操 | 欧美成人xxxx|