由于项目需要实现UDS刷写功能,在网上查找资料后自己详细总结了UDS34-36-37服务的具体步UDS骤及参数说明,第一次写文章,望大家指正不足之处
一、34-36-37服务
(1)34服务:
//xxx代表连续帧中的有效字节总数(SID到有效数据最后一位的字节数,此处为11即(0 0B)16,第5字节固定是44
-------------------------------------------------------------------------------
上位机发送 1x xx 34 00 44 add add add
UDS回复 30 00 00 00 00 00 00 00
上位机发送:21 add 字节数 字节数 字节数 字节数 00 00
UDS回复: 74 20 maxdata maxdata 00 00 00 00
-------------------------------------------------------------------------------
||||上位机接收到UDS的回复后,通过第二字节的高4bit判断该截取第三个字节到哪个字节作为UDS可接受的一帧最大字节数,暂定为int maxbytes。
//例程中maxdata maxdata 固定是 00 C2 (即一个连续帧可接收的最大有效字节数为194,减去36服务首帧中的SID与BlockIndex后剩余一帧数据最大字节数为192字节)
(2)36服务:
使用连续帧发送时,UDS每一个连续帧中回复一次流控帧和一次36服务的正或负响应
1发送第一帧数据:
>>>>其中xxx为有效字节长度,该长度在例程中为194,连续帧中总有效字节数(包含SID号和BlockIndex)不可大于该长度
>>>>若某块中数据字节数小于UDS回复的一次可发送最大字节数,则x xx为该地址对应的实际字节长度
>>>>由于34回复的maxdata为可以接收的总有效字节(其中包括SID与BlockIndex共占两个字节)因此加上SID与BlockIndex后最大的数据长度不可超过192字节
>>>>>>>>>>>>连续帧首帧中第四字节第一次发送时为01,后续每一个连续帧首帧中该字节加1,直到加到FF后,从00开始循环。
||||上位机将上面截取的maxbytes移位后添到连续帧首帧中的第一字节的低4bit与第二字节
-------------------------------------------------------------------------------
上位机发送:1x xx 36 01 data data data data
UDS回复 :30 00 00 00 00 00 00 00
上位机发送:21 data data data data data data data
……………
上位机发送 2x data data data data data 00 00
UDS每次回复下方数据之前会对刚刚接收到的块数据进行CRC校验,之后会回复正响应,但此处并无CRC校验失败后的处理程序
UDS回复 02 76 BlockIndex 00 00 00 00 00
-------------------------------------------------------------------------------
2发送第二个块 :此处BlockIndex++
-------------------------------------------------------------------------------
上位机发送:1x xx 36 02 data data data data
UDS回复 :30 00 00 00 00 00 00 00
上位机发送:21 data data data data data data data
……………
上位机发送 2x data data data data data 00 00
UDS回复 02 76 BlockIndex 00 00 00 00 00
-------------------------------------------------------------------------------
3发送第n个块 :设此处blockindex = n
-------------------------------------------------------------------------------
上位机发送:1x xx 36 n&0xFF data data data data
UDS回复 :30 00 00 00 00 00 00 00
上位机发送:21 data data data data data data data
……………
上位机发送 2x data data data data data 00 00
UDS回复 02 76 n&0xFF 00 00 00 00 00
-------------------------------------------------------------------------------
>>>>上位机循环发完该连续地址的所有数据之后使用37服务退出
>>>>若还有其他地址块数据需要下载则再次使用34服务下载下一个连续地址的数据
待数据全部下载完成后
上位机发送 01 37 00 00 00 00 00 00
UDS回复 01 77 00 00 00 00 00 00
二、若某个数据块的字节数小于192,则流程如下:
34服务:
>>>> x xx为0B
>>>>例程中maxdata回复时固定是(194)10
-------------------------------------------------------------------------------
上位机发送 1x xx 34 00 44 add add add
UDS回复 30 00 00 00 00 00 00 00
上位机发送:21 add 字节数 字节数 字节数 字节数 00 00
UDS回复: 74 20 maxdata maxdata 00 00 00 00
-------------------------------------------------------------------------------
36服务:
发送数据:
>>>>其中x xx为上位机计算的该块中字节数的总数+SID(1)+BlockIndex(1)(总数需小于等于34服务中UDS回复的maxdata)若一个连续帧发不完,发送多个连续帧将该连续地址中的数据发送完毕。
-------------------------------------------------------------------------------
上位机发送:1x xx 36 01 data data data data
UDS回复 :30 00 00 00 00 00 00 00
上位机发送:21 data data data data data data data
……………
上位机发送 2x data data data data data 00 00
UDS回复 02 76 BlockIndex 00 00 00 00 00
-------------------------------------------------------------------------------