
串口调试助手源代码 qt编写 带协议解析 帧判断 通信数据保存等功能 使用说明介绍 1.功能介绍 采用Qt编写的串口调试助手工具功能齐全除了具备十六进制收发及文件保存等基本功能外还具有以下功能可以对发送的历史数据存储还可存储常用的两条数据可自动保存用户的选择下次打开后会自动配置好数据可对接收和发送按照协议自定义有一个可以对长度、类型等常用字段的编辑表格可配置帧同步配置即根据帧头帧尾及长度等判断一帧数据是否接收完成带有的保存到文件功能文件名根据时间自动生成。 2.环境说明 开发环境是Qt5.10.1使用Qt自带的串口库若需要第三方串口库可找作者索取。 源代码中包含详细注释使用说明设计文档等。 请将源码放到纯英文路径下再编译。 3.使用介绍 可直接运行在可执行程序里的exe文件操作并了解软件运行流程。 本代码产品特点 1、尽量贴合实际应用方便软件模块复用提供。 2、注释完善讲解详细还有相关扩展知识点介绍。 3、提供代码设计文档使用文档环境配置文档等。 4.子功能模块介绍 具备十六进制发送定时发送显示时间等基本功能。 可保存历史数据方便快速调取 可根据协议自定义数据并完成解析及组装 可配置四种类型的帧同步完成帧头帧尾定长等帧判断 可将接收到的数据原样发送回去便于调试 可自动保存用户上次使用的窗口大小及配置数据先看通信模块核心代码这坨代码负责和硬件死磕void SerialPort::handleReadyRead() { QByteArray data m_serial-readAll(); // 帧同步处理 if(m_frameParserEnabled){ m_buffer.append(data); while(auto frame parseFrame()){ emit newFrame(frame.value()); } } else { emit newData(data); } }这里藏着帧解析的玄机——边收数据边拆帧底层搞了个循环缓冲区。parseFrame()内部实现四种帧同步算法像极了路由器处理网络包的方式保证不丢帧不粘包。协议配置界面直接用了Qt的Model/View架构表格编辑溜到飞起// 协议字段模型 class ProtocolModel : public QAbstractTableModel { Q_OBJECT public: //...省略标准模型代码 QVariant data(const QModelIndex index, int role) const override { if(role Qt::EditRole index.column() 2){ return QVariant::fromValue(m_fields[index.row()].dataType); } //...其他处理 } private: QVectorProtocolField m_fields; };这个模型类把协议字段类型玩出花下拉菜单直接内置了长度、校验、时间戳等十几种数据类型配合信号槽自动刷新数据解析界面。数据持久化做得贼贴心看这保存配置的骚操作void MainWindow::saveSettings() { QSettings settings(MyCompany, SerialDebugger); settings.setValue(geometry, saveGeometry()); settings.setValue(baudRate, ui-baudRateBox-currentIndex()); //...保存其他20参数 }退出时自动保存窗口位置、波特率这些配置到注册表下次打开直接满血复活。历史数据用SQLite存着查询时直接上索引加速实测存了10万条记录照样秒查。串口调试助手源代码 qt编写 带协议解析 帧判断 通信数据保存等功能 使用说明介绍 1.功能介绍 采用Qt编写的串口调试助手工具功能齐全除了具备十六进制收发及文件保存等基本功能外还具有以下功能可以对发送的历史数据存储还可存储常用的两条数据可自动保存用户的选择下次打开后会自动配置好数据可对接收和发送按照协议自定义有一个可以对长度、类型等常用字段的编辑表格可配置帧同步配置即根据帧头帧尾及长度等判断一帧数据是否接收完成带有的保存到文件功能文件名根据时间自动生成。 2.环境说明 开发环境是Qt5.10.1使用Qt自带的串口库若需要第三方串口库可找作者索取。 源代码中包含详细注释使用说明设计文档等。 请将源码放到纯英文路径下再编译。 3.使用介绍 可直接运行在可执行程序里的exe文件操作并了解软件运行流程。 本代码产品特点 1、尽量贴合实际应用方便软件模块复用提供。 2、注释完善讲解详细还有相关扩展知识点介绍。 3、提供代码设计文档使用文档环境配置文档等。 4.子功能模块介绍 具备十六进制发送定时发送显示时间等基本功能。 可保存历史数据方便快速调取 可根据协议自定义数据并完成解析及组装 可配置四种类型的帧同步完成帧头帧尾定长等帧判断 可将接收到的数据原样发送回去便于调试 可自动保存用户上次使用的窗口大小及配置数据帧同步配置界面搞了个策略模式四种判断方式随便切FrameParser* createFrameParser(FrameType type) { switch(type) { case HEAD_TAIL: return new HeadTailFrameParser(); case FIXED_LEN: return new FixedLengthFrameParser(); case DELIMITER: return new DelimiterFrameParser(); case DYNAMIC_LEN: return new DynamicLengthFrameParser(); } }每个解析器子类实现不同的帧判断逻辑比如动态长度解析器会根据协议里配置的长度字段偏移量来算帧长完美适配各种奇葩协议。文件保存功能暗藏玄机文件名生成规则值得偷师QString generateFileName() { QDateTime now QDateTime::currentDateTime(); return QString(COM%1_%2.log) .arg(m_currentPortName.mid(3)) .arg(now.toString(yyyyMMdd_hhmmsszzz)); }文件名带毫秒级时间戳和串口号保证不会覆盖。保存时开独立线程写文件界面完全不卡实测连续收10MB数据保存时CPU占用不到5%。源码里埋了不少彩蛋比如在协议解析窗口按CtrlAltQ会弹出隐藏的调试控制台能直接发AT指令测试模块。编译时记得把third_party里的驱动库扔进项目目录不然某些冷门串口芯片会闹脾气。这工具最骚的是回环测试功能收到数据直接原样扔回去配合协议解析可以玩自动化测试。某次用它抓包分析智能电表硬是发现了厂家协议里的CRC校验漏洞甲方爸爸直接给项目加鸡腿。