基于RTT-LVGL便携Can诊断仪系统设计案例

电子说

1.2w人已加入

描述

应用背景:

随着生活水平提升,越来越多的车进去用户家庭,车辆在保养健康维护过程中好多隐藏的问题不便于拆卸和查看,比如hud模块,是否有遇到过高压冲击,是否有点击、led、屏、间断性失去通讯等一些列隐藏故障以及版本是否较老,有新版本软件更新迭代是否可以升级等等。针对这一类问题,车身模块本身有版本定义、故障码诊断反馈以及uds测试模式调图等功能,这时候需要有一定的诊断设备发特定报文与模块通讯才能请求到uds诊断信息。

于是就有了这个便携诊断工具设计。为了方便4S店以及维修人员对车辆的健康状态的维护和保养,快捷的获取车辆状态等信息,该诊断仪当前可用于对汽车的诊断模块版本信息,uds诊断调节基本功能检查是否有故障,部分模块切换测试图查看显示效果是否异常,读取故障状态等,最终联网数据储存服务器,便于后续统计车辆维护状态,历史故障情况

另外该诊断工具小巧,便于携带,一些不便于携带大件行李情况下可以方便携带,装口袋即可;未来对于一些有一定专业技能的人士可以添加诊断报文用户定义编译,可以指定报文发送请求,这样对于使用的广泛性得以扩大。

实现功能:

通过按键以及调节滑块等操作发出指定uds诊断报文,请求对应诊断模块的故障状态显示出来。另外可以连接网络上报服务器此次诊断具体信息,用于服务器统计记录该车历史排查维修记录,方便排查历史记录

正文:

1.效果展示

设计操作页面如下,通过点击按钮可发出can诊断报文,等待回应状态显示到诊断仪上。最终连接网络,上传诊断数据信息。整体ui效果页面如下:

RTThread

2.硬件框架

硬件结构上比较简单,框架设计如下,芯片的can 口通过OBD连接车身can网,wifi模块连接在服务器局域网内(当然在不方便联网情况下可以先进行诊断,后面将数据存储诊断仪flash中,待有网络下联网上报诊断数据)

RTThread

3.软件框架

软件结构上主要是上电启动后注册驱动,初始化完can wifi等外设后加载ui,随后子线程中信号阻塞监听can报文,直到接收到了can报文,单片机中断,发出信号量,子线程读取can报文内容。

Ui任务中按钮以及滑块等用户交互接口会触发对应点击事件,收到按钮点击后组包发出一条can诊断报文,等待can回应信息后,解析回应内容存储对应buffer中,并更新ui显示内容。
Tcp连接按钮按下会在子线程创建socket任务,等待上传任务或者再次点下按钮终止任务。上传按钮按下会将诊断信息从buffer中取出,重新组包,按字符串形式存储,之后调用先前创建的socket中send指令发出

RTThread

4.软件逻辑

a) Ui使用SquareLine工具设计,开机后加载ui,如下是绘制的ui效果

RTThread

b) 配置can数据波特率500kbit/s,初始化设备驱动后打开设备,创建线程不断监听can信息

RTThread

子线程中通过阻塞监听信号量,而信号量是由can收到数据中断发出信号量,配置驱动中Every Message触发can中断,再读取can数据解析打印出来。

RTThread

开机后点击按钮,可以看到can接受线程打印的log,can发送接受数据正常

RTThread

c) Wifi使用板子上rw007模块,使能ifconfig等工具方便调试,在加载ui后配置了wifi名字和密码3次请求连接

RTThread

复位开机后串口中也可以看到wifi连接是成功的

RTThread

d) Can诊断统一封装到can_port_req_uds_cmd接口请求和第四个参数为返回结构体指针,void*类型可按个人需求封装数据结构,最终返回了id,len长度以及data指针,最终数据按对应格式调整显示

RTThread

e) Tcp客户端在按钮connect点击后创建新线程连接,连接后保持等待,直到提交数据按钮按下时

RTThread

诊断到的信息打包成对应格式按字符串方式传递,通过socket实例发送出去给服务器端

RTThread

通过tcp上位机监听和串口打印信息,可以看到诊断信息上传ok

RTThread

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分