qt qserialport串口号自动更新

目的

解决插拔设备时,串口号不实时更新的问题。

自动更新串口号

    timer = new QTimer;
    connect(timer,&QTimer::timeout,this,&serial::UpdatePort);//更新端口号
    timer->start(1000);
    QStringList newPortStringList;
    const auto infos = QSerialPortInfo::availablePorts();
    for (const QSerialPortInfo &info : infos)
    {
        newPortStringList += info.portName();
    }
    //更新串口号
    if(newPortStringList.size() != oldPortStringList.size())
    {
        oldPortStringList = newPortStringList;
        serialPortComboBox->clear();
        serialPortComboBox->addItems(oldPortStringList);
    }

效果

效果

参考例程

#include "serial.h"
//#include <QTimer>
serial::serial(QWidget *parent) : QWidget(parent)
{
    //串口界面布局
    serialPortComboBox = new QComboBox;
    serialPortComboBox->setMinimumWidth(80);
    serialPortComboBox->setMaximumWidth(80);
    COMBtn = new QPushButton("打开串口");
    COMBtn->setMinimumWidth(80);
    COMBtn->setMaximumWidth(80);
    COMInf = new QLabel;
    COMInf->setFrameStyle(QFrame::Panel | QFrame::Sunken);
    COMInf->setAlignment(Qt::AlignBottom | Qt::AlignLeft);
    COMInf->setMinimumWidth(40);
    COMInf->setMaximumWidth(40);
	
    QHBoxLayout *COMLayout = new QHBoxLayout;
    COMLayout->addWidget(serialPortComboBox,1);
    COMLayout->addWidget(COMBtn,1);
    COMLayout->addWidget(COMInf,1);
//    COMLayout->addStretch(2);

    //获取串口号
    m_serialPort = new QSerialPort();
    oldPortStringList.clear();
    const auto infos = QSerialPortInfo::availablePorts();
    for (const QSerialPortInfo &info : infos)
        oldPortStringList << info.portName();
    serialPortComboBox->addItems(oldPortStringList);


    setLayout(COMLayout);
    timer = new QTimer;
    connect(COMBtn,&QPushButton::clicked,this,&serial::COMBtnClick);//打开串口
    connect(timer,&QTimer::timeout,this,&serial::UpdatePort);//更新端口号
    timer->start(1000);
    qDebug() << "串口类创建成功";
}

serial::~serial()
{
    delete m_serialPort;
    delete timer;
}


bool serial::COMBtnClick()
{
//    qDebug() << "进入串口按键中断";
    if(COMBtn->text()=="打开串口")
    {
        if(m_serialPort->isOpen())
        {
            return true;
        }
        QString num;
        int errflag;
        m_portName = serialPortComboBox->currentText();
        m_serialPort->setBaudRate(QSerialPort::Baud115200);
        m_serialPort->setPortName(m_portName);
        errflag = m_serialPort->open(QSerialPort::ReadWrite);
        if(true!=errflag)
        {
//           QMessageBox *err = new QMessageBox;
//           err->setText("打开串口失败");
            return false;
        }
        COMBtn->setText("关闭串口");
        COMInf->setText("Open");
//        edtTagInf->setText(tr("open"));
    }
    else if((COMBtn->text()=="关闭串口"))
    {
        if(m_serialPort->isOpen())
        {
            m_serialPort->close();
            COMBtn->setText("打开串口");
            COMInf->setText("Close");
//            edtTagInf->setText(tr("close"));
        }
    }
    return true;
}
//更新端口号
void serial::UpdatePort()
{
    QStringList newPortStringList;
    const auto infos = QSerialPortInfo::availablePorts();
    for (const QSerialPortInfo &info : infos)
    {
        newPortStringList += info.portName();
    }
    //更新串口号
    if(newPortStringList.size() != oldPortStringList.size())
    {
        oldPortStringList = newPortStringList;
        serialPortComboBox->clear();
        serialPortComboBox->addItems(oldPortStringList);
    }

}

void serial::sendData(QByteArray data)
{
    m_serialPort->write(data);
}

#ifndef SERIAL_H
#define SERIAL_H

#include <QWidget>
#include "QSerialPort"
#include <QSerialPortInfo>
#include "QtWidgets"
class serial : public QWidget
{
    Q_OBJECT
public:
    explicit serial(QWidget *parent = 0);
    ~serial();
    QSerialPort *m_serialPort;//串口类
    int m_buadRate;//波特率
    QString m_portName;//端口号
    QComboBox *serialPortComboBox;//选择串口号
    QPushButton *COMBtn;//串口按钮
    void sendData(QByteArray data);
private:
    QLabel *COMInf;
    QTimer *timer;
//    QStringList SerialPortList;
    QStringList oldPortStringList;
signals:
    void recieveData(QByteArray);
public slots:
    bool COMBtnClick(void);
    void UpdatePort();//更细端口号



};

#endif // SERIAL_H
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值