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();
}