欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Qt5--串口开发常用技巧

程序员文章站 2022-04-01 10:29:42
目录一、引用库1、.pro文件中添加2、引用头文件二、初始化1、初始化串口号函数三、定时更新串口号四、一个按键完成:打开、关闭的功能一、引用库1、.pro文件中添加QT += serialport2、引用头文件在mainwindow.h中添加头文件#include #include 二、初始化1、初始化串口号函数找出可以使用的串口号并添...

一、引用库

1、.pro文件中添加

QT       += serialport

2、引用头文件

在mainwindow.h中添加头文件

#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

二、初始化

1、初始化串口号函数

  • 找出可以使用的串口号并添加到串口列表中去
  • 使用定时器定时调用该函数,实现及时更新出新的串口
void MainWindow::InitSerial()
{
    QStringList newPortStringList;
    static QStringList oldPortStringList;

    const auto infos = QSerialPortInfo::availablePorts();
    for (const QSerialPortInfo &info : infos)
    {
        newPortStringList += info.portName();
    }
    //更新串口号
    if(newPortStringList.size() != oldPortStringList.size())
    {
        oldPortStringList = newPortStringList;
        ui->portComBox->clear();
        ui->portComBox->addItems(oldPortStringList);
    }
}

三、定时更新串口号

int             gUpdatePortTmr;   // 标记定时器号
bool            gSerialSwitchFlg; // 标记串口的开关状态
void MainWindow::InitTimer()
{
    gUpdatePortTmr = startTimer(900, Qt::CoarseTimer);
}
// 定时器事件
void MainWindow::timerEvent(QTimerEvent *event)
{
    if(event->timerId() == gUpdatePortTmr)
    {
        if(!gSerialSwitchFlg)// 串口是关闭的就可以定时更新串口号
            InitSerial();
    }
}

四、一个按键完成:打开、关闭的功能

配合定时更新串口号的功能,可以只用一个按键就完成打开、关闭的功能,实现界面的简洁。

bool            gSerialSwitchFlg; // 标记串口的开关状态
QSerialPort    *gSerialPort;
void MainWindow::on_openBtn_clicked()
{
    if(!gSerialSwitchFlg) // 串口是关闭的
    {
		gSerialPort = new QSerialPort();
		gSerialPort->setPortName(ui->portComBox->currentText());
		gSerialPort->setBaudRate(ui->baudComBox->currentText().toInt());//波特率
		gSerialPort->open(QIODevice::ReadWrite);//读写方式打开
		gSerialPort->setDataBits(QSerialPort::Data8);//数据位
		gSerialPort->setParity(QSerialPort::NoParity);//奇偶校验
		gSerialPort->setStopBits(QSerialPort::OneStop);//停止位
		gSerialPort->setFlowControl(QSerialPort::NoFlowControl);//控制位
		
		connect(gSerialPort, SIGNAL(readyRead()), this, SLOT(ReadSerialData()), Qt::DirectConnection);
    
        //关闭设置菜单使能
        ui->portComBox->setEnabled(false);
        ui->baudComBox->setEnabled(false);
        ui->stopComBox->setEnabled(false);
        ui->checkComBox->setEnabled(false);
        ui->dataComBox->setEnabled(false);
        ui->openBtn->setText("Close");
        gSerialSwitchFlg = true;
        ui->recvTextBro->append("Serial is Opening");
    }
    else
    {
        //关闭串口子线程
		gSerialPort->clear();
		gSerialPort->close();//关闭子线程
		gSerialPort->deleteLater();

        //恢复设置使能
        ui->portComBox->setEnabled(true);
        ui->baudComBox->setEnabled(true);
        ui->stopComBox->setEnabled(true);
        ui->checkComBox->setEnabled(true);
        ui->dataComBox->setEnabled(true);
        ui->openBtn->setText("Open");
        gSerialSwitchFlg = false;
        ui->recvTextBro->append("Serial is Closing");
    }
}

void MainWindow::ReadSerialData()
{
    static QByteArray sumData;
    QByteArray tempData = gSerialPort->readAll();

    if(!tempData.isEmpty())
    {
        qDebug() << tempData;
        sumData.append(tempData);
        if(sumData.contains("\n"))
        {
        	// 数据处理
            sumData.clear();
        }
    }
    tempData.clear();
}

本文地址:https://blog.csdn.net/qq_28877125/article/details/109707459

相关标签: Qt