Qt串口通信,支持热插拔

.pro文件添加:QT       += serialport

//添加头文件
#include <QSerialPort>
#include <QSerialPortInfo>

//头文件声明类成员变量
QSerialPort m_pSerialPort;
QComboBox* m_pComboBox;
QTextEdit* m_pTextEdit;
QLineEdit* m_pLineInput;

//构造函数文件
QSerialPort m_pSerialPort = new QSerialPort();
m_pTextEdit = new QTextEidt();
m_pComboBox = new QComboBox();
m_pLineInput = new QLineEdit();
//接收信息信号与槽的连接
connect(m_pSerialPort, &QSerialPort::readyRead, this, &Widget::onRecvInfo);
//发生错误时信号与槽的连接
connect(m_pSerialPort, static_cast<void (QSerialPort::*)(QSerialPort::SerialPortError)>(&QSerialPort::error), this, &Widget::onHandleSerialError);

//初始化ComboBox(运行程序后自动获取设备的所有可用连接)
void initComboBox()
{
    m_pComboBox->clear();
    static QList<QSerialPortInfo> serialPortNameList = QSerialPortInfo::availablePorts();
    for(int i = 0; i < serialPortNameList.count(); i++)
        m_pComboBox->addItem("Com " + QString("%1:").arg(i, 2, 10, QChar('0')) +        serialPortNameList.at(i).portName());
}



//打开串口函数
void openSerialPort()
{
    if(m_pSerialPort->isOpen())
    {
        m_pSerialPort->clear();
        m_pSerialPort->close();
    }
    m_pSerialPort->setPortName(m_pComboBox->currentText().split(":").at(1));
    if(!m_pSerialPort->open(QIODevice::ReadWrite))
        return ;
    m_bInputBtn = true;
    //设置波特率和读写方向
    m_pSerialPort->setBaudRate(QSerialPort::Baud115200, QSerialPort::AllDirections);
    //设置数据位
    m_pSerialPort->setDataBits(QSerialPort::Data8);
    //设置无流控制
    m_pSerialPort->setFlowControl(QSerialPort::NoFlowControl);
    //设置无校验位
    m_pSerialPort->setParity(QSerialPort::NoParity);
    //一位停止位
    m_pSerialPort->setStopBits(QSerialPort::OneStop);
}

//接收信息槽函数
void Widget::onRecvInfo()
{
    QByteArray info = m_pSerialPort->readAll();
    m_pTextEdit->append(info);
    m_pTextEdit->moveCursor(QTextCursor::End);
    //转为16进制
    //QByteArray hexData = info.toHex();
}

//错误处理槽函数
void Widget::onHandleSerialError(QSerialPort::SerialPortError error)
{
    if (error == QSerialPort::ResourceError) {
            QMessageBox::critical(this, tr("Error"), "串口连接中断,请检查是否正确连接!");
            m_pSerialPort->close();
    }
}

//发送信息到设备函数
void sendMsg()
{
    QString str = m_pLineInput->text();
    str = str + "\n";
    QByteArray byteArry = str.toLatin1();
    m_pSerialPort->write(byteArry);
    m_pLineInput->clear();
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Qt是一款流行的跨平台开发工具,可以用于开发各种桌面和移动应用程序。QextSerialPortQt的一个串口通信库,可以用于在Qt应用程序中进行串口通信操作。 在一些应用场景中,我们可能需要支持串口的热插拔,即在运行过程中可以动态插拔串口设备。对于这个问题,QextSerialPort库本身并不直接支持热插拔功能,但我们可以通过结合Qt的其他特性实现串口的热插拔。 首先,我们可以使用Qt的信号与槽机制来处理串口的插拔事件。可以通过定时器等方式,在一定时间间隔内检测串口设备的插拔状态变化,当发现串口设备插入或拔出时,就发送一个信号给应用程序。 其次,我们可以在应用程序中动态打开和关闭串口。当检测到串口设备插入时,通过调用QextSerialPort的open函数来打开该串口设备;当检测到串口设备拔出时,调用QextSerialPort的close函数来关闭该串口设备。 另外,我们可以用一个QList或QVector来存储当前已经打开的串口设备,这样就可以随时查询当前连接的串口设备。当检测到串口设备插入时,将新插入的设备添加到列表中;当检测到串口设备拔出时,从列表中移除相应的设备。 需要注意的是,在动态插拔串口设备时,我们应该在操作串口之前先确认该串口设备是否可用。可以使用QextSerialPort提供的函数isPortNameAvailable来判断指定串口设备是否可用。 总结起来,我们可以通过使用Qt的信号与槽机制、动态打开关闭串口、存储已打开串口设备的列表、检测串口设备是否可用等方式实现Qt QextSerialPort库中的串口热插拔功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值