can協議解析字符串的原理

這裏的數據使用的是標準的can設備產生的can信號(擴展幀發送數據ID=0x11121181 Data=0x06 0x08)

信號的波形如圖1所示,這裏示波器的探頭接的是CAN_H,探頭的夾子接的是CAN_L:

圖1 示波器顯示波形

首先根據本博客中前面寫的一篇如何測量can總線波特率獲取總線的波特率,然後依據波特率和上面的波形讀出具體的數據

從上面的波形中讀取到的數據是

10111011101100011110111001111101011111001111101001111100111101111011011101

根據標準can2.0b協議可以講該字符串解析出來,標準的擴展協議如圖2所示

圖2 can擴展消息格式

然後將數據根據格式劃分成各個有意義的字段,如圖3所示,這裏我自己將高電平編碼爲1,低電平編碼爲0。但是在can協議中,他將高電平定義爲顯性位,邏輯上定義爲0,將低電平定義爲隱形位,邏輯上定義爲1,我們前面先不管這個。

圖3 數據分割

在can的協議中當連續出現5個高電平時就需要插入一個低電平,所以在解析的過程中需要將這些插入的數據刪除,就是圖3中用紅線刪除的那些數據。

在刪除這些數據之後根據圖2的格式可以將各個字段分割出來

解析信息:

29位ID:0 1110 1110 1101 1110 1110 0111 1110,從右到左每4位一個字段,這裏需要將其在轉換回can協議定義的邏輯電平的形式---即將0變爲1,將1變爲0,這樣便符合我們日常的編碼習慣。解析出來的ID=0x11121181,與我們發送的數據是相符合的。

DLC:1101 轉換成十進制爲2 表示這一幀中有兩個數據,接下來的16個字節便表示2個數據

D1:11111001 = 0x06

D2:11110111 = 0x08

這樣便解析出了我們需要的數據,這是和我發送的數據一致的。

 

這裏需要注意的有兩點:

1、在can的協議中當連續出現5個高電平時就需要插入一個低電平;

2、在can協議中將CAN_H和CAN_L的差值爲高電平時定義爲顯性,邏輯上表示爲0,爲低電平時定義爲隱形,邏輯上表示爲1。這在解碼的過程中需要注意。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章