基于QT的串口助手的实时更新检测串口的解决方案实现



使用QT编写串口助手时,常见的一个问题是,当读取到可用串口时,一般是将其保存到一个 QStringList 里,直到真正打开串口。

但是在打开串口功能时,之前已保存的串口号是否还有效,或者说,在成功连接串口之后,如果中途串口断开,QSeiresPort 并没有提供相关的检测函数,那么就需要我们自己动手实现能够实时检测到该串口是否还可用,如果不可用,应立即将串口关闭。

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

//定义全局变量
QSerialPort *serialPort;
QTimer *timer;
QStringList portStringList; //保存当前可用的串口号
QString currentCOM = "";

//在主函数
timer = new QTimer; //定时扫描和更新串口
connect(timer,&QTimer::timeout,this,&Widget::showValidPort);//实时更新端口号
timer->start(1000); //每1000ms定时检测串口状态
serialPort = new QSerialPort; //实例化串口对象
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) //扫描可用串口
        portStringList += info.portName();
ui->com->addItems(portStringList);

//更新并检测串口函数实现
void showValidPort()
{
    QStringList newPortStringList;
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
        newPortStringList += info.portName();
    if(newPortStringList.size() != portStringList.size())
    {
        portStringList = newPortStringList;
        ui->com->clear();
        ui->com->addItems(portStringList);
    }
    if(currentCOM != ui->com->currentText()) //串口突然断开连接了
    {
        currentCOM = ui->com->currentText();
        if("关闭" == ui->comSwitchBtn->text())
        {
            on_comSwitchBtn_clicked();
        }
    }
}


void on_comSwitchBtn_clicked()
{
	if("打开" == ui->comSwitchBtn->text())
	{
		currentCOM = ui->com->currentText();
        serialPort->setPortName(currentCOM); //获取串口号
        if(serialPort->open(QIODevice::ReadWrite)) //如果打开串口成功
        {
        	//...
        }
	}
	else if("关闭" == ui->comSwitchBtn->text())
    {
        ui->comSwitchBtn->setText("打开");
        serialPort->close();
    }
}



全部工程的实现可参考:
链接:https://pan.baidu.com/s/1r5pLaeCu5mieWKNu90GWDA
提取码:feng
跳转:工程下载链接【提取码:feng】



版权声明:本文为fengge2018原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。