使用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版权协议,转载请附上原文出处链接和本声明。