• 使用ControlCAN.dll收发报文功能实现诊断仪与硬件的UDS报文交互


    背景上位机使用ControlCAN.dll收发报文功能模拟诊断仪发送19 42故障问询报文,获取硬件故障信息。在此记录下程序实现过程中遇到的问题及解决措施。

    1. 上位机一直在发送19 42服务问询硬件故障信息

    在这里插入图片描述
    原因分析:目前上位机模拟诊断仪与硬件的报文交互策略制定不合理导致cantest采集到的报文不连续,目前报文交互策略如下:
    单开一个诊断线程,上位机程序一直判断是否接收到来自硬件回复诊断仪的报文,如果接收到的话就将报文数据储存起来。诊断仪需要发送的报文,包括回复硬件的报文都使用同一个函数执行。

    策略调整:假设通讯正常不会超负载,不会出现报文丢失的情况,诊断仪发19 42问询硬件DTC状态后,等待硬件回复。硬件回复可能存在两种情况:回复单帧(无故障)、或者回复首帧(存在至少一个故障)。如果硬件回复单帧,诊断仪继续发送19 42询问硬件当前DTC状态(周期性问询),如果硬件回复首帧,诊断仪发送流控帧,等待硬件响应流控帧回复连续帧完毕后,诊断仪再继续发送19 42询问硬件当前DTC状态(周期性问询)。

    2. 上位机接收硬件回复报文信息存在报文丢失的问题

    按照上述调整之后的策略,第一次修改程序,cantest采集到的报文数据如下:
    在这里插入图片描述
    检查程序怀疑可能原因是正好没有接收到第一次硬件发送的响应19 42的首帧报文导致程序继续发送19 42问询故障状态。
    正确的诊断仪与硬件的应答流程如下:
    在这里插入图片描述
    使用ControlCAN.dll接收报文函数获取到的硬件应答报文存在报文缺失现象:
    在这里插入图片描述
    策略调整:上位机程序应该保证连续帧的每一帧都获取到,如果中间存在报文丢失的情况,放弃这次问询,模拟诊断仪继续发送19 42询问当前DTC状态。但是这样子做还是没有从根本上改变报文丢失上位机程序获取不到但是cantest能够采集到的情况,将会导致一直获取不到完整的DTC状态。

    问题解决考虑方向:研究ControlCAN.dll的接受报文接口函数,看为什么接收不到硬件发出来的实时应答报文。
    在这里插入图片描述
    分析采集到的cantest报文,硬件内部响应诊断仪的报文流程可能存在问题
    在这里插入图片描述
    目前存在两个问题需要解决的:(1)上位机模拟诊断仪与硬件UDS报文通讯的线程会丢失连续帧的报文数据;
    (2)硬件回复连续帧第一帧失败可能会继续发送剩下的连续帧,导致上位机解析故障报文失败。

    对于第一个问题,屏蔽掉其他线程,单独只开上位机模拟诊断仪与硬件UDS报文通讯的线程,发现能接收到硬件发出来的所有连续帧信息:
    在这里插入图片描述
    上位机读取到的硬件回复连续帧信息与cantest采集到的报文一致。
    在这里插入图片描述
    解决该问题的思路:考虑多个线程之间的资源分配问题。–待解决
    怀疑是其他线程也在调用接收报文的功能,影响读取硬件与诊断仪的UDS报文交互接收报文数据采集。
    为了验证上述思想,只屏蔽掉调用接收报文功能的线程,其他线程和硬件与诊断仪UDS报文交互的线程开放出来–测试发现能够接收到完整的连续帧报文信息。

    3. 硬件停发连续帧响应报文

    监控cantest报文发现,硬件停发连续帧响应报文。
    在这里插入图片描述
    监控上位机发出的报文,报文停止在流控帧。
    在这里插入图片描述
    思考:为什么硬件停发连续帧响应报文?

  • 相关阅读:
    Java架构师分布式搜索数据准确性解决方案
    【docker错误解决系列】 ‘buildx‘ is not a docker command.
    亚马逊、沃尔玛、eBay、Newegg如何做到稳定出单?有何方法?技术已攻破!
    百度地图画圆、画扇形、画多边形、画点
    新生儿弱视:原因、科普和注意事项
    基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四)
    java docker图片叠加水印中文乱码
    【ccf-csp题解】第四次csp认证-第四题-网络延时-树的直径
    HTML小游戏14 —— H5横版冒险游戏《无限生机》(附完整源码)
    Pytorch 中的AverageMeter 造成内存泄漏
  • 原文地址:https://blog.csdn.net/Logintern09/article/details/126142368