DBC的故事
1.DBC定義
DBC(data base CAN)是汽車ECU間進行CAN通訊的報文內容,有了它相互之間才能聽懂。
2.DBC查看
DBC是文本文件,可以用記事本打開,一般都用CANdb++,可以更方便的查看和編輯。
3.DBC組成
DBC是由一系列的Message和Signal組成,文件定義了Message和Signal的屬性,可參考vector文檔(回復「DBC文檔」獲取)。下面介紹幾個重要的關鍵字:
1)BO_
BO_是對Message的定義。
- 格式:BO_ ID Name: DLC Transmiter
- 例子:BO_ 100 ESP_01: 8 ESP
- 釋義:發送方=ESP,幀名稱=ESP_01,幀ID=0x64,報文長度=8個位元組
2)SG_
SG_是對Signal的定義。
- 格式:SG_ Name : StartBit | Length @ ByteOrder SignedFlag (Factor,Offset) [Minimum | Maximum] "Unit" Receiver1,Receiver2
- 例子:SG_ VehSpd : 7|16@0+ (0.01,0) [0|655.35] "km/h" ECM.TCM
- 釋義:信號名稱=VehSpd,起始地址=7,長度=16,位元組順序=MSB(大端),符號位=無符號,係數=0.01,偏移=0,最小值=0,最大值=655.35,單位=km/h,接收方=ECM和TCM
3)VAL_
VAL_是對Signal枚舉值的定義。
- 格式:VAL_ ID Name key1 "value1" key2 "value2" ;
- 例子:VAL_ 100 VehSpdValid 1 "Valid" 0 "Invalid" ;
- 釋義:幀ID=0x64,信號名稱=VehSpdValid,枚舉值(0x0=Invalid,0x1=Valid)
4.DBC解析
上文已經介紹了DBC的格式,接下來介紹如何使用DBC從原始報文中解析出物理值。在此之前要先理解MSB(大端)和LSB(小端)。MSB是高位在前,LSB是低位在前,大多數都用的MSB。
1)原始值
假設有3個信號:signal1、signal2和signal3,長度分別是16、4、12。這3個信號包括了3種類型:完整位元組,部分位元組和跨位元組。用Layout來比較。下面使用了位操作指令:&是按位與,<<是左移,>>是右移。
- MSB
MSB高位在前。
signal1:起始地址=7,值=Byte0<<8+Byte1。(Byte0是高位,Byte1是低位)
signal2:起始地址=23,值=(Byte2&0xf0)>>4。(取Byte2的高4位)
signal3:起始地址=19,值=(Byte2&0x0f)<<8+Byte3。(取Byte2的低4位,作為高位)
- LSB
LSB是低位在前。
signal1:起始地址=0,值=Byte0+Byte1<<8。(Byte0是低位,Byte1是高位)
signal2:起始地址=16,值=Byte2&0x0f。
signal3:起始地址=20,值=(Byte2&0xf0)>>4+Byte3<<4。(Byte2是低位,Byte3是高位)
2)物理值
物理值=原始值*Factor+Offset
3)代碼實現
以.NET(C#)為例,繪製layout,計算出數值。
(回復「DBC例子」獲取源代碼)
- MSB
- LSB
5.DBC開源資料
(回復「DBC開源」隨機獲取)
推薦閱讀:
※什麼樣的老師,可以管理好班級里同時出現維特根斯坦和希特勒那樣的調皮男學生?
※這是第三段故事,熊孩子的故事(中),摻雜了一點個人的想法。7.13
※跳級是一種什麼體驗?
※二十幾歲住在哪裡對你有多重要?
※中國美術學院校考閱卷揭秘:每張高分卷的通關之路上需要經過36位評委老師的火眼金睛
TAG:教育 |