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。這在解碼的過程中需要注意。
總結
以上是生活随笔為你收集整理的can协议解析字符串的原理的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Git 的 4 个阶段的撤销更改
 - 下一篇: C语言实现面向对象的思想