在 Qt 中实现 USB 串口的热插拔,需要使用 Qt 的串口模块 QSerialPort 和设备监视器 QDeviceWatcher。其中,QDeviceWatcher 可以监视设备的插拔事件,而 QSerialPort 可以打开和关闭串口,并读写串口数据。
以下是获取 USB 串口信息的步骤:
引入 QSerialPort、QSerialPortInfo 和 QDeviceWatcher 头文件:
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDeviceWatcher>
创建 QDeviceWatcher 对象并连接槽函数:
QDeviceWatcher *watcher = new QDeviceWatcher(this);
connect(watcher, &QDeviceWatcher::deviceAdded, this, &MainWindow::onDeviceAdded);
connect(watcher, &QDeviceWatcher::deviceRemoved, this, &MainWindow::onDeviceRemoved);
QDeviceWatcher 类用于监视设备的插拔事件,deviceAdded 信号表示设备插入事件,deviceRemoved 信号表示设备拔出事件,将这两个信号分别连接到槽函数 onDeviceAdded() 和 onDeviceRemoved()。
获取所有可用串口的信息:
QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
QSerialPortInfo::availablePorts() 函数返回所有可用的串口信息列表。
实现 onDeviceAdded() 和 onDeviceRemoved() 槽函数:
cppCopy code
void MainWindow::onDeviceAdded(const QString &dev)
{
QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
foreach (const QSerialPortInfo &info, ports) {
if (info.isBusy())
continue;
if (info.description().contains(dev) || info.portName().contains(dev)) {
QSerialPort *port = new QSerialPort(this);
port->setPort(info);
if (port->open(QIODevice::ReadWrite)) {
// 串口已打开,进行相应的操作
...
}
}
}
}
void MainWindow::onDeviceRemoved(const QString &dev)
{
QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
foreach (const QSerialPortInfo &info, ports) {
if (info.isBusy())
continue;
if (info.description().contains(dev) || info.portName().contains(dev)) {
// 关闭相应的串口
...
}
}
}
在 onDeviceAdded() 槽函数中,获取所有可用串口的信息,并遍历串口信息列表,判断串口描述或名称是否包含插入的设备名称,如果匹配则打开相应的串口并进行相应的操作。
在 onDeviceRemoved() 槽函数中,获取所有可用串口的信息,并遍历串口信息列表,判断串口描述或名称是否包含被拔出的设备名称,如果匹配则关闭相应的串口。
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!