引言
最近,需要一款上位机软件,实现CAN通信,Bootloader烧写,下位机控制(可定制协议),串口通信,曲线显示,数据记录,以及后续要更新的软件频谱分析仪功能。
设计要点
- 基于QT,开源
- 模块化设计,方便后续功能的修改和新功能的加入
- 可支持大量数据的收发和曲线作图显示,不能出现卡顿
- 支持CAN J1939协议
- Bootloader功能,应能进行协议的定义和修改
- Bootloader支持Hex和Bin双格式,Hex采用逐行发送,根据应答信号进行连续发送;Bin支持CRC校验
- 数据记录格式支持txt、csv或xls
基本思路
- 多线程设计,收发线程独立(处理CAN卡相关操作),解析线程独立(处理数据解析部分),显示线程独立(独立显示插件进行大量数据显示),存储线程独立处理文件操作部分,主线程总体调度和管理
- 线程间采用信号槽机制,实现信号和数据的传递,尽量不采用自定义数据结构,尽量不传递大量数据
- 采用线程锁,确保数据安全
- 线程中,采用while(1)循环+标志位控制相关功能的使能
界面规划
- 设备控制界面,实现CAN卡基本设置和启动
- CAN基本报文信息收发功能页
- Bootloader功能页
- 下位机控制功能页
- 其他功能页
关键技术
1.多线程和并发
上位机需要将CAN卡货串口接收到的数据进行:①报文收发,②解析,③存储,④作图和界面刷新。为提高性能,需要采用多线程来提高实时性。
设计思路为:①主线程;②CanMsgThread负责原始报文接收,作为生产线程;③ParseThread线程,用于根据协议,实现数据的解析;④SaveMsgThread作为存储线程,对选择的数据进行存储;⑤PlotThread线程,用来读取解析后的报文后,由信号槽机制通知UI线程刷新;⑥设备控制DevCtrlThread线程,读取解析后的报文,进行保护、控制等状态的更新,由信号槽机制通知UI刷新;
2.多线程方案
QT多线程的实现方法有多种:
1. 继承QThread类,重写Run()方法。缺点:①只有重写的run函数在新线程中运行;②信号槽不好实现;有点是简单直观,易于控制。详见:https://blog.youkuaiyun.com/qq_45790916/article/details/136390241
2.