如何使用QT编写自己的串口调试助手及QT串口使用注意事项

QT 如何使用QT编写自己的串口调试助手,QT串口使用注意事项


最近在学习qt,边学边写,写了个串口调试助手,记录过程的同时分享出来正在学习的伙伴。

QT 串口调试助手

** 主要功能:串口数据收发、显示,定时发送,接收数据保存、文件发送,不同编码、进制转换等。**

1 环境与工具

  • PC Windows10
  • QT 5.12.0

2 设计过程

QT实现串口通信主要是利用QT自带的串口类和函数,在.pro文件中添加"QT += serialport",然后在项目文件中包含头文件(#include ),我们就可以在项目中使用QSerialPort来读取和发送串口数据了。主要过程:实例化串口——>搜索可用串口——>打开串口——>设置串口参数——>读取数据或发送数据。

2.1 新建项目与界面布局

​ 新建串口调试助手的项目,由于QT还没玩熟,这里就直接使用QT Designer进行ui界面的绘制和布局。布局过程不再赘述,根据自己的需要放置适当的控件即可,最好对控件对象也重命名一下,完成布局后的最终效果如图:
在这里插入图片描述

2.2 程序设计

下面对主要的几个过程和程序做个说明,具体过程不再贴出来了,了解大概过程后就可以根据个人需要来新增其他功能了。
1、 首先对界面的按钮、组合选择框等控件进行一些初始化(更改背景、颜色这些也可以直接通过QT Designer ui界面右键点击控件,通过“改变样式表”等来设置)。
2、实例化对象,关联一些信号和曹信号。在这里,我们使用foreach函数来搜索和解析目前该PC上可用的端口信息,然后把解析出来的端口添加到组合选择框里面,后面就可以去从下拉框选择要打开的串口了。主要代码如下:

     //查找可用的串口
foreach(const QSerialPortInfo &info,     QSerialPortInfo::availablePorts())
    {
        QSerialPort SerialPort;
        SerialPort.setPort(info);   //解析串口信息
        if (SerialPort.open(QIODevice::ReadWrite))
        {
            SerialPortName.push_back(SerialPort.portName());
            SerialPort.close();
        }
    }
    
    //把端口添加到组合框
 for (int i = 0; i < SerialPortName.size(); ++i)
 {
   ui->SelectCOM_comboBox>addItem(SerialPortName.at(i)); 
 }

3、打开和设置串口
在这里,我使用点击按钮来触发打开串口事件,在打开按钮的槽函数中进行串口打开就可以。打开以后进行串口参数的设置,如波特率、校验位、停止位等。这些参数从界面的设置读取,这里给出主要代码,参数直接指定,从窗口获取参数也是同理,只是需要从ui界面获取参数。

** 这里要注意:务必要先打开串口,然后在进行参数设置,否则很有可能出现读取不到数据的情况。(很明显的特征就是,串口设备拔掉再插上,打开串口读不到数据或者乱码,拿其他软件打开串口,再切回自己的程序就可以读到数据了)。 **

 SerialPort->setPortName(SelectCOM_comboBox->currentText()); //获取串口端口号
   if(!(SerialPort->isOpen())) //串口没有打开
   {
    if (!SerialPort->open(QIODevice::ReadWrite))
    {
        QMessageBox::information(this, "提示", "串口连接失败,请检查设备是否正确连接");
    }
    else
    {
        //QMessageBox::information(this, "提示", SelectCOM_comboBox->currentText() + tr("连接成功"));
        SerialPort->setBaudRate(115200);  //设置波特率115200
        SerialPort->setDataBits(QSerialPort::Data8);   //8位数据位
        SerialPort->setParity(QSerialPort::NoParity);  //无校验位
        SerialPort->setStopBits(QSerialPort::OneStop);  //1位停止位
        SerialPort->setFlowControl(QSerialPort::NoFlowControl); //默认无流控

        SerialPort->clearError();
        SerialPort->clear();
       
        //关联串口数据读取槽函数
        connect(SerialPort, &QSerialPort::readyRead, this, &setDialog::slot_serialReadData); 
        //关联串口连接异常处理槽函数
        connect(SerialPort, static_cast<void (QSerialPort::*)(QSerialPort::SerialPortError)>(&QSerialPort::error),  this, &setDialog::handleSerialError);
    }
   }

4 、读取数据
串口有数据发过来时会触发串口读信号(readyRead),所以读数据就要提前将readyRead绑定到读取槽函数,然后直接使用串口的readAll()或者readData()等函数来读取串口数据就可以,读到的数据根据需要进行转码,然后进行显示、保存等操作。主要代码如下:
绑定信号和槽: connect(SerialPort, &QSerialPort::readyRead, this, &setDialog::slot_serialReadData);

QByteArray receiveDate;
    QTextCodec *tc = QTextCodec::codecForName("GBK");  //编码转换,必须转换编码,否则乱码

    while(!SerialPort->atEnd()){
        receiveDate = SerialPort->readAll();
    }

    if (!receiveDate.isEmpty())
    {
        QString strBuf=tc->toUnicode(receiveDate);         //编码转换,必须转换编码,否则乱码
        COMRXtextBrowser->append(strBuf);
    }
    receiveDate.clear();

5、发送数据

​ 要发送串口数据也很简单,使用write()函数即可,前提是串口要先打开和设置好参数。下面是主要代码:

    QTextCodec *gbk = QTextCodec::codecForName("GBK");  
    //从Ui文本输入框读取数据
    QString strSendMessage = ui->Send_textEdit->toPlainText(); 

    if(ui->TXHex_checkBox->isChecked())
     {
        strSendMessage=hexToString(strSendMessage); //hex格式转化为Qstring
     }

    if(ui->TXEnter_checkBox->isChecked()) //添加换行/回车
     {
        strSendMessage+="\r\n";
     }

    QByteArray sendBytes;
    sendBytes.append(gbk->fromUnicode(strSendMessage)); //编码转换,必须转换编码,否则乱码
    if(SerialPort->isWritable())
    {
        SerialPort->write(sendBytes);
        TXCounter+=sendBytes.size();
        ui->TXCountlabel->setText(tr("TX:%1").arg(TXCounter));
    }
    else{
        QMessageBox::information(this,"Tip","串口未打开!");
    }

6、 关闭串口

​ 关闭串口可以手动通过点击按钮关闭或者在窗口关闭时去关闭串口,为避免出现异常,窗口关闭时把串口也关闭了。关闭串口也很简单,使用close()函数就可以。代码如下:

    if(SerialPort->isOpen())
    {
        SerialPort->close();
        ui->SeralOperat_pushButton->setText(tr("打开串口"));
        QMessageBox::information(this,"提示","串口连接断开");
    }

7、其他

​ 串口还有很多功能,这里就不一一列举,需要可以去QT助手搜索有哪些方法,如何使用等。
最终实现效果如图:
在这里插入图片描述

3 注意事项和说明

1、在工程文件.pro中要添加QT += serialport,否则编译会报错
2、串口要先打开,然后进行参数设置,否则容易出现读取不到数据的情况
3、 串口数据读取的数据需要进行转码(尤其是和硬件平台通信时),否则中文字符会乱码
4、在对ui控件进行操作前,务必要先执行设置ui函数(ui->setupUi(this)),否则执行会出错。

写的调试软件还有定时更新串口列表,保存接收数据,发送文件,定时发送等功能,在此不一一详述了。我把完整源码奉上,需要参考的伙伴可以直接下载源码,注释写的也很清楚。
源码请在资源页下载:https://mp-new.csdn.net/mp_download/manage/download/UpDetailed
本人也是刚学习QT,欢迎大家交流、留下宝贵意见。

  • 1
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值