上一篇《聽說你的日志還在用printf“打游擊”?AUTOSAR DLT 正規軍了解一下》,我們講了日志的輸出方式。
我相信大多數人在大多數情況下是用 printf 形式輸出文本日志的:這里需要就塞一行,那里需要就填一句。好像很容易就解決了眼前的問題。這就好比革命初期適合打游擊,到一定規模后,你會發現需要大部隊、需要集團軍,需要規范的紀律和軍紀,而不是這里放一槍那里打一炮。
你也曾想將公司所有項目的日志打印統一成一種標準格式,嘗試“統一六國”。研究了 AUTOSAR 的 DLT,發現很難,想搞統一卻沒有秦始皇的魄力。
DLT 難嗎?
接下來我教你掰開里面的每個 bit,你會恍然大悟——原來如此。
1. DLT 本質上就是一個通信內容格式
它是一種結構化的消息,由三部分組成:
標準頭 (Standard Header) + 擴展頭 (Extended Header) + 負載 (Payload)。
而且里面的內容還可以裁剪,這個可裁剪的“機關”就藏在標準頭的第一個字節里。

標準頭的第一個字節叫 HTYP (Header Type),它的每個 bit 決定了后面哪些字段出現、Payload 用什么字節序。我們把它掰開看:

MSBF表示playload里的字節是大端還是小端;
WEID表示要不要用ECU ID;
WSID表示要不要用Session ID;
WTMS表示要不要帶時間戳;
VERS表示當前用的DLT是哪個版本。
2. 最小形態:Non?Verbose 模式(摳摳搜搜的小 MCU 最愛)
如果你把 UEH 設為 0(不要擴展頭),WEID/WSID/WTMS 全為 0(不要那些可選字段),那么整個 DLT 報文就變成了:
Standard Header: HTYP(1) + MCNT(1) + LEN(2) → 共 4 字節
Payload: MessageID(4) + 原始數據
這就是 Non?Verbose 模式。
非常精簡,非常適合那些資源緊張的小 MCU:想打印日志,又要摳摳搜搜省字節。
外部再用一個 FIBEX 文件描述每個 MessageID 對應的具體參數含義,完美平衡帶寬與可讀性。
3. 復雜形態:Verbose 模式(自描述,花樣多)
當你把 UEH 設為 1,擴展頭就出來了。擴展頭里有個 MSIN 字節,其中 bit0 就是 VERB 標志:
· VERB = 1 → 進入 Verbose 模式,Payload 變成 自描述 的格式。
Verbose 模式下,Payload 是由一個或多個 參數 組成的,每個參數的結構如下:
Type Info(4字節) + Data Payload (變長)
Type Info 這 4 個字節才是真正的“武功秘籍”。我們把它的 32 個 bit 掰開:

其中0-3 TYLE表示長度編碼:1=8bit,2=16bit,3=32bit,4=64bit,5=128bit
從后面的bit看,可以支持很多種類型的參數輸出。
看到這里,你也許覺得這條路可行,但好像是一份武功秘籍,目前還駕馭不了。
沒關系,我已經把這份武功秘籍的精髓提煉出來了。你往下看,我把 DLT 信息結構體給你拆解清楚。
4. 一圖勝千言:DLT 完整報文結構體拆解
廢話少說,直接上圖



5. 結語:你也能成為 DLT 的“秦始皇”
DLT 看起來復雜,是因為它要兼顧靈活性(適應不同總線、不同資源)和規范性(統一解析)。
但一旦你理解了 HTYP 是開關,Type Info 是百寶箱,整個協議就豁然開朗。
不要再讓 DLT 成為你“統一六國”路上的絆腳石。
從今天起,拿起你的編輯器,照著上面這個結構體,試著解析一條 DLT 報文——你會回來感謝自己的。
以上,我覺得你放進收藏夾也是吃灰的,不如點個贊點個在看再走!
?? 下一篇預告:手把手教你寫一個最小 DLT 解析器,附代碼示例。
關注我,一起把嵌入式調試武裝到牙齒。