Wednesday, 09 December 2020 10:49

ISO15765-4协议的代码实现-数据链路层网络层NL_OBD_SendCANFrame函数代码详解(源自C300开发板教程) Featured

具体看NL_OBD_SendCANFrame函数关于ISO15765-4协议这部分代码的实现。

如下图所示。


NL_OBD_SendCANFrame函数有4个参数:
第1个参数 pro, 当前要处理的CAN协议类型,协议类型可以是SAEJ1939,ISO15765_4STD_500K,ISO15765_4EXT_500K。当前我们讨论的是后两种协议。
第2个参数TxMessage,待发送的请求数据,如上图中的EntCmd15765,DTCCmd15765,VinCmd15765,DSCmd15765。
第3个参数TimeOut,等待响应超时时间,单位为毫秒。如果在该设置时间内没有得到汽车或者模拟器响应请求数据,则超时。超时标志由第4个参数表示。
第4个参数 *err, 该参数用以表示函数请求响应是否超时,参数必须为NLStatus定义变量的地址。超时则未得到汽车或者模拟器响应 *err = NL_NOK;没有超时则说明在第3个参数规定的时间内获得了汽车或者模拟器针对当前请求信息的响应 *err=NL_OK。
看函数体本身代码,51行将第1个参数值赋值给全局变量OBDFlag.ProType,它将在中断中起作用。52行到56行用于SAEJ1939协议,前面已经解释过,这里不再讨论。57行到64行通过判断pro的值确定当前请求数据是以11bit标准CAN请求还是以29bit扩展CAN请求,并设置发送数据的IDE类型。65行OBDFlag.RxFlag用来表示当前协议请求数据发送后,中断是否获得完整响应数据,如果获得完整响应数据OBDFlag.RxFlag=NL_SUCCESS,否则OBDFlag.RxFlag=NL_FAILURE,此处让OBDFlag.RxFlag=NL_FAILURE就是为了等待中断赋值NL_SUCCESS给OBDFlag.RxFlag,如果中断始终没有获得请求数据的完整汽车响应数据OBDFlag.RxFlag的值一直是NL_FAILURE。66行*err 首先赋值NL_NOK,如果在第3个参数规定时间内获得请求数据的汽车完整响应数据,OBDFlag.RxFlag=NL_SUCCESS,我们就让*err=NL_OK,下面的68行到77行代码就是实现这个内容的。67行代码通过_NL_OBD_CAN_Transmit(TxMessage)函数把第2个参数待发送的请求数据发送出去。...

继续阅读完整内容

请查看下方广告以解锁文章剩余内容

广告加载中...
Read 20921 times
 
Please support our site by viewing this advertisement.

Please support our site by viewing this advertisement

Free Content