在 Linux 系统中实现 USB 串口的热插拔,需要使用 Qt 的串口模块 QSerialPort 和 Linux 特有的系统调用。其中,Qt 的 QSerialPort 可以打开和关闭串口,并读写串口数据,而 Linux 的系统调用可以获取 USB 设备的信息,如设备文件路径、设备名称等。
以下是在 Linux 系统中获取 USB 串口信息的步骤:
引入 QSerialPort 头文件:
#include <QSerialPort>
使用 Linux 特有的系统调用获取 USB 设备信息:
QDir devDir("/dev");
devDir.setFilter(QDir::System | QDir::Files);
devDir.setNameFilters(QStringList() << "ttyUSB*");
QFileInfoList devList = devDir.entryInfoList();
foreach (const QFileInfo &info, devList) {
QString devPath = info.absoluteFilePath();
QString devName = info.fileName();
// 进行相应的操作
...
}
通过 类获取 目录下的所有设备文件,然后使用 函数设置名称过滤器,仅获取以 开头的设备文件。最后遍历设备文件列表,获取设备文件路径和设备名称。QDir/devsetNameFilters()ttyUSB
实现热插拔事件:
QSocketNotifier *notifier = new QSocketNotifier(0, QSocketNotifier::Read, this);
connect(notifier, &QSocketNotifier::activated, this, &MainWindow::onDeviceChanged);
int fd = ::inotify_init();
if (fd != -1) {
::inotify_add_watch(fd, "/dev", IN_CREATE | IN_DELETE | IN_MOVED_TO | IN_MOVED_FROM);
notifier->setEnabled(true);
}
使用 Linux 的 系统调用监视 目录下的设备插拔事件,创建 对象将 文件描述符添加到事件循环中,连接到 槽函数。inotify/devQSocketNotifierinotifyonDeviceChanged()
实现 槽函数:onDeviceChanged()
void MainWindow::onDeviceChanged()
{
char buf[1024];
int len = ::read(notifier->socket(), buf, sizeof(buf));
if (len > 0) {
int pos = 0;
while (pos < len) {
struct inotify_event *event = (struct inotify_event *)(buf + pos);
if (event->mask & IN_CREATE || event->mask & IN_MOVED_TO) {
if (QString(event->name).startsWith("ttyUSB")) {
// 设备插入
...
}
} else if (event->mask & IN_DELETE || event->mask & IN_MOVED_FROM) {
if (QString(event->name).startsWith("ttyUSB")) {
// 设备拔出
...
}
}
pos += sizeof(struct inotify_event) + event->len;
}
}
}
在 槽函数中,通过读取 文件描述符获取设备插拔事件,如果事件类型为 或 'IN_MOonDeviceChanged()inotifyIN_CREATE
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!