UDS 診斷教程 (三)
在上一篇文章中我寫(xiě)了 Diagnostic and Communication Management (診斷和通信管理)
這一類(lèi)診斷服務(wù)中的 0x10 , 0x11 , 0x27,在這篇文章中繼續(xù)這一大類(lèi)診斷服務(wù)中的其他
內(nèi)容。
CommunicationControl (0x28)
該服務(wù)用于打開(kāi)/關(guān)閉某些類(lèi)別的報(bào)文的發(fā)送/接收。它通常在刷寫(xiě)軟件或大量數(shù)據(jù)的時(shí)候
使用,因?yàn)樵谒④浖騾?shù)的時(shí)候并不需要 ECU 進(jìn)行與通信相關(guān)的功能,將通信關(guān)閉之
后可以把所有通信資源都留給軟件或參數(shù)的下載,當(dāng)下載過(guò)程完成之后再利用該服務(wù)將通
信恢復(fù)即可。
0x28 服務(wù)的格式如下圖所示

第一部分即 SID,一個(gè) byte,值為 0x28;
第二部分是 sub-function,表明要對(duì) ECU 的通信進(jìn)行哪種控制,具體包括 :
0x00 enableRxAndTx (激活接收和發(fā)送)
0x01 enableRxAndDisableTx(激活接收和關(guān)閉發(fā)送)
0x02 disableRxAndEnableTx(激活發(fā)送和關(guān)閉接收)
0x03 disableRxAndTx(關(guān)閉接收和發(fā)送)
0x04 enableRxAndDisableTxWithEnhancedAddressInformation(激活接收和關(guān)閉發(fā)送,
針對(duì)特定的地址)
0x05 enableRxAndTxWithEnhancedAddressInformation(激活接收和發(fā)送,針對(duì)特定的
地址)
0x06 - 0x7F 都是保留或者留給廠商自定義的。
第三部分表明這條診斷請(qǐng)求要對(duì)哪種報(bào)文進(jìn)行控制,長(zhǎng)度為 1 個(gè) byte,定義如下表所示:

這個(gè) byte 中最常用的就是低 2 bit,0x1 代表普通應(yīng)用報(bào)文,0x2 代表網(wǎng)絡(luò)管理報(bào)文,0x3
代表普通應(yīng)用報(bào)文和網(wǎng)絡(luò)管理報(bào)文。
第四部分是 optional 的,只有當(dāng) sub-functional 等于 0x04 或 0x05 時(shí)才需要使用。
舉個(gè)完整的診斷服務(wù)例子:
28 01 01 表示 激活應(yīng)用報(bào)文的接收并 關(guān)閉應(yīng)用報(bào)文的發(fā)送(網(wǎng)絡(luò)管理報(bào)文不受影響)。
28 00 01 表示 激活應(yīng)用報(bào)文的接收和 發(fā)送(網(wǎng)絡(luò)管理報(bào)文不受影響)。
TesterPresent (0x3E)
這個(gè)診斷服務(wù)的用處可以通過(guò)它的名字很明顯地得知,即告知 ECU 診斷儀還在連接著。
在上一篇文章中我說(shuō)到了關(guān)于 session 的部分,如果沒(méi)有診斷命令的發(fā)送和接收,ECU 將
從 non-default session 中回退到 default session, 0x3E 就是用于使 ECU 保持在當(dāng)前
session。
這應(yīng)該是 UDS 中最簡(jiǎn)單的一個(gè)診斷服務(wù)了,它永遠(yuǎn)只有兩個(gè) byte,格式如下:

當(dāng) sub-function 是 0x00 時(shí),ECU 要給出 response;當(dāng) sub-function 是 0x80 時(shí),ECU 不
需要要給出 response。
一般來(lái)說(shuō)主機(jī)廠會(huì)為這個(gè)服務(wù)定義兩個(gè)時(shí)間參數(shù),一個(gè)參數(shù)用于規(guī)定自己的診斷儀發(fā)送
0x3E 服務(wù)的間隔,另一個(gè)參數(shù)用于定義 ECU 收不到 0x3E 服務(wù)的 timeout 時(shí)間。
ControlDTCSetting (0x85)
該服務(wù)用于控制 ECU 的 DTC 存儲(chǔ),這個(gè)服務(wù)常常和前面提到的 28 服務(wù)一起使用,比如,
在開(kāi)始寫(xiě)參數(shù)之前,為了獲得更快的傳輸速度,我們用 28 服務(wù)把所有 ECU 的通信關(guān)閉了,
但此時(shí)因?yàn)槭盏讲坏较嚓P(guān)的報(bào)文,ECU 會(huì)沒(méi)有必要地存儲(chǔ)很多 DTC,這時(shí)如果我們使用
85 服務(wù)把 ECU 存儲(chǔ) DTC 的功能暫時(shí)性地禁止掉,則不會(huì)造成這種麻煩。

第一部分即 SID,一個(gè) byte,值為 0x85;
第二部分是 sub-function,表明是打開(kāi)還是關(guān)閉 ECU 的 DTC 存儲(chǔ),具體包括 :
0x01 on
0x02 off
第三部分是 optional 的,由各家自己定義,比如,可以用 FF FF FF 來(lái)表示這條診斷命令
針對(duì)所有的 DTC。
ResponseOnEvent (0x86)
我在以前的文章里說(shuō),診斷通信過(guò)程是問(wèn)答式的,診斷儀發(fā)請(qǐng)求,ECU 給響應(yīng)。0x86 服
務(wù)算是一個(gè)例外,在 ECU 收到這條 0x86 服務(wù)之后,當(dāng) DTC 產(chǎn)生時(shí),它會(huì)自動(dòng)地上報(bào)
DTC 及相關(guān)環(huán)境數(shù)據(jù),直到用另一條 0x86 服務(wù)來(lái)關(guān)閉 ECU 的這個(gè)行為。
該功能主要用于 ECU 的前期開(kāi)發(fā)階段,在售后和生產(chǎn)中是不會(huì)用到的,而且該服務(wù)的格
式復(fù)雜(即可變的參數(shù)很多),執(zhí)行它還分為好幾個(gè)步驟,我就不詳細(xì)寫(xiě)了。
LinkControl (0x87)
這個(gè)服務(wù)用于轉(zhuǎn)化 ECU 數(shù)據(jù)鏈路層和物理層的狀態(tài),比如,在高速 CAN 上的 ECU 正常
通信速率是 500 kbit/s,但它同時(shí)也支持 1M bit/s 的波特率,如果需要刷寫(xiě)大量數(shù)據(jù),便
可以利用這條診斷服務(wù)讓 ECU 以 1M bit/s 的波特率進(jìn)行通信。
這個(gè)診斷服務(wù)的執(zhí)行分為兩個(gè)步驟:
1. 驗(yàn)證 ECU 是否支持要調(diào)整到的目標(biāo)波特率
2. 讓 ECU 的數(shù)據(jù)鏈路層和物理層轉(zhuǎn)到目標(biāo)波特率的通信狀態(tài)
只有當(dāng)?shù)谝粋€(gè)步驟驗(yàn)證通過(guò)了,第二個(gè)步驟才可以成功執(zhí)行。