UDS 診斷教程 (四)
這篇文章介紹一下 UDS 的第二類診斷服務(wù),即 Data Transmission (數(shù)據(jù)傳輸) (數(shù)據(jù)傳輸)。這類診斷服務(wù)包括
以下 SID:
ReadDataByIdentifier (0x22)
ReadMemoryByAddress (0x23)
ReadScalingDataByIdentifier (0x24)
ReadDataByPeriodicIdentifier (0x2A)
DynamicallyDefineDataIdentifier (0x2C)
WriteDataByIdentifier (0x2E)
WriteMemoryByAddress (0x3D)
通常,0x22 和 0x2E 成對(duì)使用,0x23 和 0x3D 成對(duì)使用,這幾個(gè)服務(wù)用于診斷數(shù)據(jù)的基本讀寫操作。
0x24,0x2A,0x2C 是一些特殊操作。
0x22 和 和 0x2E 這兩個(gè)服務(wù)是對(duì)以 標(biāo)識(shí)符(identifier)標(biāo)記的數(shù)據(jù)的操作,前者是讀,后者是寫。UDS 規(guī)定,
診斷數(shù)據(jù)使用兩個(gè) byte 的標(biāo)識(shí)符來(lái)標(biāo)記,比如,0xF187 用來(lái)標(biāo)記 ECU 的零件號(hào),0xF19E 用于標(biāo)記該
ECU 所使用的診斷文件的名字,UDS 還規(guī)定了廠家可以自定義的標(biāo)識(shí)符范圍。這兩個(gè)服務(wù)的用法很簡(jiǎn)單,
下面我以讀取 ECU 的零件號(hào)為例說(shuō)明:
22 F1 87 (讀取零件號(hào))
62 F1 87 XX YY ZZ KK MM NN(給出零件號(hào))
具體每次可以使用 22 服務(wù)讀取幾個(gè) ID,每個(gè) ID 的讀寫權(quán)限(比如在哪些 session 中可以讀寫,是否需
要安全訪問(wèn)操作等),由廠家自定義。假設(shè)零件號(hào)這個(gè) ID 是可以寫入的話,則寫零件號(hào)的診斷命令是:
2E F1 87 XX YY ZZ KK MM NN(寫入零件號(hào))
6E F1 87(給出 positive response)
0x23 和 和 0x3D 這兩個(gè)服務(wù)是對(duì)以地址信息(memoryAddress )標(biāo)記的數(shù)據(jù)的操作,前者是讀,后者是
寫。這個(gè)命令的格式稍微復(fù)雜一點(diǎn)。以 0x23 為例,它的診斷請(qǐng)求格式是:

第一部分固定為 1 個(gè) byte, 0x23;
第二部分是格式信息,長(zhǎng)度為 1 個(gè) byte,
高 4 bits 用于指示 memorySize 的長(zhǎng)度(字節(jié)數(shù)),低 4 bits
用于指示 memoryAddress 的長(zhǎng)度(字節(jié)數(shù))。比如,如果這個(gè)值為 0x46,則后面的 memorySize 為 6
個(gè) byte,memoryAddress 為 4 個(gè) byte。
第三部分是 memoryAddress 信息,它的長(zhǎng)度由第二部分的 AddressAndLengthFormatIdentifier 指示。
第四部分是 memorySize 信息,它的長(zhǎng)度由第二部分的 AddressAndLengthFormatIdentifier 指示。
如果這條命令的格式是 23 22 xx yy aa bb,則它的含義就是,讀取 xx yy 地址的長(zhǎng)度為 aa bb 的數(shù)據(jù)。
了解了 0x23 的用法,0x3D 的用法就很好理解了,它標(biāo)識(shí) memoryAddress 和 memorySize 的方法與
0x23 相同,只是在診斷命令最后再加上一段需要寫入的數(shù)據(jù)。
0x24,0x2A,0x2C 這幾個(gè)特殊操作,使用場(chǎng)景不多,我組織組織語(yǔ)言,在下篇文章里簡(jiǎn)要介紹一下。