自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

7E頭解析的那些事兒(幀格式分析實例)

開發(fā) 前端
作為一名嵌入式工程師,經(jīng)常需要通過UART與外設(shè)打交道,而對于串行總線來說,往往我們必須要進行幀同步。通常的做法是把信令包含在2個0x7E的中間。

[[431168]]

0. 前言

作為一名嵌入式工程師,經(jīng)常需要通過UART與外設(shè)打交道,而對于串行總線來說,往往我們必須要進行幀同步。通常的做法是把信令包含在2個0x7E的中間。

除此之外還有HDLC、PPP等協(xié)議也會到有此應(yīng)用場景。

那么如何從這些數(shù)據(jù)幀中提取有效數(shù)據(jù)呢?

本文通過一個簡單的實例給大家詳細講述如何從幀中提取有效的協(xié)議信令。

1. 幀格式要求

首先我們明確下幀提取的一些要求:

(1)把信息字段中出現(xiàn)的每一個0x7E字節(jié)轉(zhuǎn)變?yōu)?字節(jié)序列(0x7D,0x5E)。

(2)若信息字段中出現(xiàn)一個0x7D的字節(jié)(即出現(xiàn)了和轉(zhuǎn)義字符一樣的比特組合),則把轉(zhuǎn)義字符0x7D轉(zhuǎn)變?yōu)?字節(jié)序列(0x7D,0x5D)。

舉例:一個PPP幀的數(shù)據(jù)部分:

  1. 7D 5E FE 27 7D 5D 7D 5D 65 7D 5E 

那么實際上真正的數(shù)據(jù)是

  1. 7E FE 27 7D 7D 65 

轉(zhuǎn)換圖解:

同樣的,如果要發(fā)送數(shù)據(jù),則反過來。

2. 設(shè)計

  • 底層傳上來的每一短幀長度不固定
  • 底層傳上來的每一短幀7e頭位置不固定,可能有可能沒有,可能有1個7e也可能有2個7e
  • 默認每一幀數(shù)據(jù)最多2個7e

比如:我們從底層收上來的原始數(shù)據(jù)幀格式如下:

那么我們要能夠提取兩個7e之間的協(xié)議數(shù)據(jù)幀,同時還原幀中的所有的7e。

很顯然我們希望最終解析后結(jié)果如下:

  1. 7e 0f 0e 30 27 1c 00 27 1c 01 27 1c 02 7e 00 29 7e  
  2. 7e 11 73 7e  
  3. 7e 00 27 1c 01 27 1c 02 7e 00 29 7e  

幀解析詳細設(shè)計流程圖

3.代碼

不上代碼的就是耍流氓

首先看下如果下發(fā)數(shù)據(jù)幀,如何將所有的7e和7d做替換:函數(shù)hdlc_send(char * data,UINT8 len)實現(xiàn)如下:

int hdlc_rcv_frm(UINT8 *data,int len)實現(xiàn)如下

測試代碼如下:

  1. int main() 
  2.  int len; 
  3.   
  4.  char data1[6]={0x7e,0xf,0xe,0x30,0x27,0x1c};  
  5.  char data2[6]={0x0,0x27,0x1c,0x1,0x27,0x1c}; 
  6.  char data3[8]={0x2,0x7d,0x5e,0x0,0x29,0x7e,0x0,0x7e}; 
  7.  char data4[6]={0x11,0x73,0x7e,0x30,0x27,0x7e};  
  8.  char data5[6]={0x0,0x27,0x1c,0x1,0x27,0x1c}; 
  9.  char data6[6]={0x2,0x7d,0x5e,0x0,0x29,0x7e};  
  10.  
  11. #if 0 
  12.  printf("************測試hdlc_send()******************\n"); 
  13.  
  14.  len = hdlc_send(data1,6); 
  15.  
  16.  printf("********************end**********************\n\n"); 
  17. #endif 
  18.  printf("\n************測試hdlc_rcv_frm()******************\n"); 
  19.  hdlc_rcv_frm(data1,6); 
  20.  hdlc_rcv_frm(data2,6); 
  21.  hdlc_rcv_frm(data3,8); 
  22.   
  23.  hdlc_rcv_frm(data4,6); 
  24.  hdlc_rcv_frm(data5,6); 
  25.  hdlc_rcv_frm(data6,6); 
  26.  printf("********************end**************************\n"); 
  27. 運行結(jié)果如下: 

運行結(jié)果如下:

注意

本代碼仍然有一些bug,暫時沒有修改,所以實際項目慎用。小心數(shù)組越界啊!

完整代碼鏈接:

鏈接:https://pan.baidu.com/s/1rPEDC3erLpPRH0OnkfNH_A

提取碼:wzxq

 

責任編輯:武曉燕 來源: 一口Linux
相關(guān)推薦

2009-06-16 08:58:30

微軟Windows 7操作系統(tǒng)

2021-11-11 23:16:33

前端數(shù)據(jù)格式Web

2023-04-11 07:34:40

分布式系統(tǒng)算法

2021-03-18 09:01:53

軟件開發(fā)軟件選型

2011-02-25 14:35:00

2018-09-26 06:50:19

2021-06-02 08:33:31

TPCTPC-H系統(tǒng)

2022-02-08 17:39:04

MySQL服務(wù)器存儲

2013-12-26 14:23:03

定位系統(tǒng)GPS監(jiān)測

2021-06-09 13:28:40

密碼安全身份認證數(shù)據(jù)安全

2018-02-02 13:58:59

數(shù)據(jù)存儲

2012-07-19 15:30:00

Linux

2017-08-09 08:25:35

DBA數(shù)據(jù)庫OLAP

2022-11-04 07:57:59

編程編碼編譯器

2010-04-07 13:13:19

Visual Stud

2013-07-09 13:50:05

2022-08-04 10:18:32

棧遷移?寄存器內(nèi)存

2021-05-10 08:58:09

Harbor架構(gòu)Registry 服務(wù)

2010-10-15 10:31:00

2021-09-04 16:12:33

壓縮算法數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號