Wednesday, 09 December 2020 10:42

ISO15765-4协议-读故障码的代码实现(源自C300开发板教程) Featured

ISO15765-4 读故障码
代码片段如下所示:

图片

97行判断车速是否为0,通过函数ISO15765_4_GetNotDrivingState判断。并且判断OBDStruct.DTCStruct.flag是否为RESET。条件满足的情况下才能读取故障码。其中OBDStruct.DTCStruct.flag值是RESET说明刚上电从来没有读取故障码,或者OBDStruct.DTCStruct.DTC的故障码已经被TaskTCP上传至服务器。99行是读取故障码函数,接下来我们会具体分析这个函数。100行到105行判断ISO15765_4_GetDTC函数是否读取故障码成功,如果读取成功就把ISO15765_4_GetDTC函数返回的指针指向存储单元的故障码存储到OBDStruct.DTCStruct.DTC中,并且设置 OBDStruct.DTCStruct.flag = SET 供TaskTCP上传至服务器。

图片

 

下面具体看ISO15765_4_GetDTC函数。

函数有两个参数,参数1表示协议类型。参数2表示故障码读取成功与否的标志。76行代码对DTCRAM进行清空,DTCRAM在本函数中用于存储故障码结果。77行利用NL_OBD_SendCANFrame函数发送故障码请求并希望获得汽车或者模拟器响应,返回指针指向故障码响应数据的应用层原始数据的存储单元。为了更直观理解函数工作原理,使用模拟器设置故障码P0143,P0196,P0234,P02CD,P0357,P0A24,并在78行打断点查看ram指向存储单元的值,如下图所示。

图片

图片

图片

图片

ram指向存储单元这些值中,第3字节表示故障码个数,第4字节开始每两个字节表示一个故障码。所以下面就很容易理解了,81行到88行限制故障码个数,最多故障码个数不能超过10个,ram[2]存储的就是第3字节故障码个数。89到94行以故障码个数为for循环次数,循环一次把一个应用层原始数据的故障码编码成ascii编码的故障码。结果存储于DTCRAM中,我们可以在97行打断点看看处理的结果,如下图所示。

ISO15765 4 read DTC 007

95行在DTCRAM故障码编码处理完毕后在最后一个字节末尾加上0结束字符。97行函数返回DTCRAM数组地址。

 
Read 20343 times

GPS singal acquisition,replay and test equipment

Portable singal acquisition and replay

AI intelligent tongue imager

Tongue imager rafavi
 
Please support our site by viewing this advertisement.

Please support our site by viewing this advertisement

Free Content