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 8443 times