第四次汇报学习笔记:串口工具真正“好用”的关键在接收区。数据量一大就会遇到:卡顿、找不到关键帧、HEX 一行太长看不清。解决思路是:先保证性能,再提升可读性。
当工具开始长期跑数据时,接收区会暴露出三个问题:
-
越跑越卡:文本越来越长,追加越来越慢;
-
找内容困难:没有过滤,海量输出里找一帧像大海捞针;
-
HEX 难读:连续输出一长串字节,肉眼无法快速定位。
1. 自动清屏:不是“功能”,是“防崩策略”
QPlainTextEdit 的文本越长,操作成本越高,所以我提供“自动清屏”选项:
-
勾选后,当
characterCount()超过阈值就清空; -
清空后要把“对齐显示”内部状态也重置(例如表头已打印标记)。
这类优化最好在早期就做,否则后面你会不断遇到“为什么跑 20 分钟就卡死”的反馈。
2. 关键字过滤:同时支持文本和 HEX 匹配
调试串口协议时,你可能输入的关键字是:
-
文本关键字:
ERROR、OK; -
HEX 关键字:
01 03、0xAA55、AA55。
因此过滤实现不能只针对 rawText.contains(),而应该准备多种表示:
-
原始文本(本地编码转 QString)
-
HEX(无空格)
-
HEX(带空格)
用户输入关键字后:
-
原样在 rawText 里做大小写不敏感匹配;
-
同时把关键字“规范化”为 HEX(去空格、去 0x、转大写);
-
在 hexNoSpace 和 hexSpaced 两种形式里都尝试匹配;
-
不匹配则直接 return —— 但要注意只丢弃显示,不影响计数与保存。
这样用户可以用“同一个过滤框”覆盖文本协议和二进制协议。
3. 日志模式:给每条数据加 TIME / TX / RX,并保持对齐
普通模式下,接收区就是“不断追加”,简单直接。但当你需要对比:
-
某条发送对应哪条接收;
-
每条帧的时间间隔;
-
HEX 输出中某个字节的位置;
就需要更像“日志”的格式。
我做了一个“日志模式”:
-
每条记录可选显示时间戳(毫秒级);
-
可选显示 TX(发送内容);
-
RX / TX 都统一走
appendDisplayFrame(bytes, isTx)这个入口; -
在日志模式下,把 HEX 以固定列数换行,并打印一次表头,让每行都从“第 0 列”对齐。
对齐显示的核心点是:固定列宽 + 固定前缀宽度。 否则每行长度不同就会歪,越看越累。
4. 一条统一的显示入口:appendDisplayFrame
我强烈建议:不要在 readyRead 里直接拼字符串显示,显示策略会越来越复杂。
更好的结构是:
-
readyRead 只负责:计数、保存、协议/轮发处理、过滤判断;
-
过滤通过后,统一调用
appendDisplayFrame(buf, false); -
发送时如果选择“显示发送”,也调用
appendDisplayFrame(bytes, true)。
这样显示策略(普通/日志、HEX/文本、是否时间戳、是否帧换行)就集中在一个地方维护。
5. 小结
接收区优化让我真正体会到:工具软件不是“把功能堆上去”就完事了。
-
自动清屏解决性能下限;
-
关键字过滤解决定位效率;
-
日志模式 + 对齐显示解决可读性与分析效率;
-
统一显示入口让后续扩展不会失控。







