串口调试助手源代码 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:
    QVector<ProtocolField> 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%。

源码里埋了不少彩蛋,比如在协议解析窗口按Ctrl+Alt+Q会弹出隐藏的调试控制台,能直接发AT指令测试模块。编译时记得把third_party里的驱动库扔进项目目录,不然某些冷门串口芯片会闹脾气。

这工具最骚的是回环测试功能,收到数据直接原样扔回去,配合协议解析可以玩自动化测试。某次用它抓包分析智能电表,硬是发现了厂家协议里的CRC校验漏洞,甲方爸爸直接给项目加鸡腿。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐