Qt实现定时自动检测串口

本文介绍了如何使用Qt的QSerialPort和QSerialPortInfo类进行串口操作,包括获取串口信息、设置串口参数及自动检测串口变化。通过一个定时器实现串口列表的自动刷新,并在串口状态改变时进行相应处理,确保应用程序与串口的正确连接。
摘要由CSDN通过智能技术生成

Qt实现定时自动检测串口

在学Qt串口使用时,参考了CSDN上挺多的博客,大部分都讲的不错,适合初学者。

串口操作基本介绍

Qt为串口操作提供了两个类QSerialPort和QSerialPortInfo,QSerialPortInfo可以用来获取电脑当前接入的串口信息,包括串口号、系统地址、基础描述和制造厂商等。QSerialPort提供了操作串口的接口,包括打开和关闭串口、读取串口数据、通过串口返送数据、设置串口数据传输长度、停止位、奇偶校验位等基础配置。具体可参见Qt帮助手册。

QSerialPortInfo使用

参照Qt帮助手册,使用availablePorts(),可获取当前活动的串口号,返回一个串口号列表。实例如下

QStringList MainWindow::getportinfo()
{
    QStringList serialportinfo;
    foreach(QSerialPortInfo info,QSerialPortInfo::availablePorts())
    {
        serialportinfo<<info.portName();
    }
   // ui->comboBox->addItems(serialportinfo);
    return serialportinfo;
}

QSerialPort使用

串口会配合combox使用,可获取当前想要打开的串口。实例化QSerialPort,配置串口信息。实例如下

void MainWindow::openserialprot()
{
    if(my_serialport->isOpen())
    {
        my_serialport->clear();
        my_serialport->close();
    }
    my_serialport->setPortName(ui->comboBox->currentText().toUtf8());
    my_serialport->open(QIODevice::ReadWrite);
    if(!my_serialport->isOpen())
    {
        qDebug()<<"串口打开错误";
        QMessageBox::critical(this,"error","串口打开失败!");
        return;
    }
    ui->Serial_close_B->setEnabled(my_serialport->isOpen());
    qDebug()<<"串口打开成功!";
    //设置各项参数
    my_serialport->setBaudRate(115200);
    my_serialport->setDataBits(QSerialPort::Data8);
    my_serialport->setFlowControl(QSerialPort::NoFlowControl); //无硬件流控制
    my_serialport->setParity(QSerialPort::NoParity);   //无奇偶校验位
    my_serialport->setStopBits(QSerialPort::OneStop);  //一个停止位
}

自动刷新串口号

利用一个定时器,每当定时结束,自动获取一次串口信息,对比上一次串口信息,判断时候需要对串口列表刷新。实例如下

 imerforport=new QTimer();
 timerforport->start(500);

 connect(timerforport,&QTimer::timeout,this,&MainWindow::reflashcombobox);

void MainWindow::reflashcombobox()
{
     timerforport->stop();
     old_portinfo=my_serialportinfo;
     my_serialportinfo=getportinfo();
     QString com=ui->comboBox->currentText();
     if(old_portinfo.length()!=my_serialportinfo.length())
     {
         ui->comboBox->clear();   //清空列表
         //说明串口列表出现变化,更新列表
         if(my_serialport->isOpen())        //有串口打开的时候
         {   //保证
             ui->comboBox->addItem(my_serialport->portName());
             foreach(QString comname, my_serialportinfo)
             {
                 if(comname!=my_serialport->portName())
                     ui->comboBox->addItem(comname);
             }
         }
         else                              //无串口打开的时候
         {
             foreach(QString comname, my_serialportinfo)
             {
                  ui->comboBox->addItem(comname);
             }

         }
         if(!my_serialportinfo.contains(com)&&my_serialport->isOpen())
            {
                QMessageBox::critical(this, tr("Error"), "串口连接中断,请检查是否正确连接!");
                closeserialport();
                ui->comboBox->removeItem(ui->comboBox->currentIndex());
            }
     }

     timerforport->start();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值