谷动谷力

 找回密码
 立即注册
查看: 3164|回复: 0
打印 上一主题 下一主题
收起左侧

开源|一个基于QT设计串口调试工具

[复制链接]
跳转到指定楼层
楼主
发表于 2022-7-17 13:15:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
开源|一个基于QT设计串口调试工具


1、概述

串口参数的配置,我们希望串口号能够自动搜索,而相应的配置参数我们可以选择。
接收信息的显示,作为调试工具,我们肯定希望能够一目了然地看到接收到目标设备发送过来的消息,所以我们需要一个显示区域来对接收的区域进行显示。
其它辅助功能, 还有如发送计数、接收计数、数据存储等功能有时候也是需要的,所以我们一并考虑。


2、界面设计
根据上一节中分析的需求,我们先来设计软件的界面。我们在QT中基于QMainWindow类生成一个操作界面,包括菜单栏、工具栏和状态栏以满足需求中对状态显示及操作命令的要求。
完成如上图的布局后,我们可以选择在属性中配置空间的参数,也可以在代码中添加相关的参数,本人习惯于在代码中完成。完成整个布局后我们先试着运行程序,正常运行则出现如下的界面:


3.1、参数设置与操作功能

配置好串口参数后,我们可以打开串口以建立连接。需要说明的是我们打开串口间离连接时,我们需要将该串口的数据接收与我们的数据接收和处理函数建立信号槽连接。具体实现如下:
  1. //打开串口
  2. void MainWindow::on_actionConnect_triggered()
  3. {
  4.     serialPort->setPortName(ui->comboBoxPort->currentText());

  5.     if(serialPort->open(QIODevice::ReadWrite))              //打开串口成功
  6.     {
  7.         serialPort->setBaudRate(ui->comboBoxBaud->currentText().toInt());       //设置波特率

  8.         switch(ui->comboBoxData->currentIndex())                   //设置数据位数
  9.         {
  10.             case 1:serialPort->setDataBits(QSerialPort::Data8);break;
  11.             default: break;
  12.         }

  13.         switch(ui->comboBoxParity->currentIndex())                   //设置奇偶校验
  14.         {
  15.             case 0: serialPort->setParity(QSerialPort::NoParity);break;
  16.             default: break;
  17.         }

  18.         switch(ui->comboBoxStop->currentIndex())                     //设置停止位
  19.         {
  20.             case 1: serialPort->setStopBits(QSerialPort::OneStop);break;
  21.             case 2: serialPort->setStopBits(QSerialPort::TwoStop);break;
  22.             default: break;
  23.         }

  24.         serialPort->setFlowControl(QSerialPort::NoFlowControl);     //设置流控制

  25.         //连接槽函数
  26.         QObject::connect(serialPort, &QSerialPort::readyRead, this, &MainWindow::ReadSerialData);

  27.         // 设置控件可否使用
  28.         ui->actionConnect->setEnabled(false);
  29.         ui->actionClose->setEnabled(true);
  30.         ui->actionRefresh->setEnabled(false);
  31.     }
  32.     else    //打开失败提示
  33.     {
  34.         QMessageBox::information(this,tr("错误"),tr("打开串口失败!"),QMessageBox::Ok);
  35.     }
  36. }
复制代码


首先我们来看看定时周期发送的过程。我们定义了一个计时器,以我们设定的时间周期触发发送命令,每次发送复选框被选中的命令一条,依次循环直到人为停止循环发送为止。具体的代码如下:
  1. //定时周期发送
  2. void MainWindow::CycleSendData()
  3. {
  4.     QCheckBox* cbSend;

  5.     while(true)
  6.     {
  7.         snIndex=snIndex>=6?1:snIndex;

  8.         cbSend=ui->groupBoxMessage->findChild<QCheckBox*>(QString("checkBoxSendEnable%1").arg(QString::number(snIndex)));

  9.         if(cbSend->isChecked())
  10.         {
  11.             WriteSerialData(snIndex);
  12.             snIndex++;
  13.             break;
  14.         }

  15.         snIndex++;
  16.     }
  17. }
复制代码



我们使用另一个串口工具来实现与我们开发的这一工具实现通讯验证。我们使用以前写得一个串口工具来实现与这一工具的通讯。一个使用使用COM1,一个使用使用COM2。具体的配置如下图所示:
注:使用虚拟串口波特率可以

来源:木南创智


640?wx_fmt=png.jpg (40.62 KB, 下载次数: 130)

640?wx_fmt=png.jpg

640?wx_fmt=png.jpg (45.97 KB, 下载次数: 125)

640?wx_fmt=png.jpg
+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-11-17 04:48 , Processed in 0.260421 second(s), 45 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表