QT的usb通讯,热插拔检测

该代码示例展示了一个使用Qt和libusb库的USB监听器,它检查USB设备的连接状态,打开/关闭设备,并处理通信。USBEventFilter类用于检测USB插拔事件。应用通过定时器每秒检查一次设备状态,并在设备连接或断开时执行相应操作。
摘要由CSDN通过智能技术生成

#include <QObject>
#include <QCoreApplication>
#include <QTimer>
#include <QEvent>
#include <QSerialPort>
#include <libusb.h>
#include <QDebug>

class USBListener : public QObject
{
    Q_OBJECT

public:
    explicit USBListener(QObject *parent = nullptr) : QObject(parent)
    {
        // 初始化libusb
        libusb_init(&context);

        // 启动定时器(每隔1秒)检查设备连接状态
        connect(&timer, &QTimer::timeout, this, &USBListener::checkDeviceStatus);
        timer.start(1000);

        // 初始时检查设备连接状态
        if (isDeviceConnected())
        {
            openDevice();
        }
    }

    ~USBListener()
    {
        closeDevice();
        libusb_exit(context); // 关闭libusb
    }

private:
    libusb_context *context;
    QSerialPort serialPort;
    QTimer timer;

    bool isDeviceConnected()
    {
        // 检查USB设备是否已连接
        libusb_device_handle *handle = libusb_open_device_with_vid_pid(context, VENDOR_ID, PRODUCT_ID);
        if (handle)
        {
            libusb_close(handle);
            return true;
        }
        return false;
    }

    void openDevice()
    {
        // 打开USB设备并进行通信设置
        serialPort.setPortName("COM1");  // 设置串口名字,根据实际情况修改
        serialPort.setBaudRate(QSerialPort::Baud115200);  // 设置波特率,根据实际情况修改
        serialPort.setDataBits(QSerialPort::Data8);  // 设置数据位,根据实际情况修改
        serialPort.setParity(QSerialPort::NoParity);  // 设置校验位,根据实际情况修改
        serialPort.setStopBits(QSerialPort::OneStop);  // 设置停止位,根据实际情况修改
        serialPort.setFlowControl(QSerialPort::NoFlowControl);  // 设置流控制,根据实际情况修改

        if (serialPort.open(QIODevice::ReadWrite))
        {
            qDebug() << "USB device opened";
            connect(&serialPort, &QSerialPort::readyRead, this, &USBListener::readData);
        }
        else
        {
            qDebug() << "Failed to open USB device";
        }
    }

    void closeDevice()
    {
        if (serialPort.isOpen())
        {
            serialPort.close();
            qDebug() << "USB device closed";
        }
    }

    void readData()
    {
        QByteArray data = serialPort.readAll();
        qDebug() << "Received data:" << data;
    }

public slots:
    void checkDeviceStatus()
    {
        if (isDeviceConnected())
        {
            if (!serialPort.isOpen())
            {
                openDevice();
            }
        }
        else
        {
            if (serialPort.isOpen())
            {
                closeDevice();
            }
        }
    }
};

class USBEventFilter : public QObject
{
    Q_OBJECT

public:
    explicit USBEventFilter(QObject *parent = nullptr) : QObject(parent)
    {
        // 安装事件过滤器,监听USB插拔事件
        QCoreApplication::instance()->installEventFilter(this);
    }

    bool eventFilter(QObject *obj, QEvent *event) override
    {
        if (event->type() == QEvent::DynamicPropertyChange)
        {
            // 检测到USB插拔事件
            qDebug() << "USB device plugged or unplugged";
            // 在这里处理热插拔逻辑
            // 例如发送信号或执行其他操作
        }

        return QObject::eventFilter(obj, event);
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    USBListener usbListener;
    USBEventFilter usbEventFilter;

    return a.exec();
}

  • USBListener类负责监听和处理USB设备的连接状态和通信操作。

    • 在构造函数中,我们初始化libusb,并启动一个定时器(每隔1秒)来检查设备的连接状态。
    • isDeviceConnected函数用于检查USB设备是否已连接。
    • openDevice函数用于打开和配置USB设备的通信设置。
    • closeDevice函数用于关闭USB设备。
    • checkDeviceStatus函数是一个槽函数,在定时器触发时调用,用于检查设备的连接状态并执行相应的操作。
  • USBEventFilter类负责监听USB插拔事件,并在事件发生时执行相应的逻辑。

    • 在构造函数中,我们使用installEventFilter方法将USBEventFilter对象安装为全局事件过滤器。
    • eventFilter函数中,我们检测到USB插拔事件后,可以在此处处理热插拔逻辑,例如发送信号或执行其他操作。

main函数中,我们创建了一个USBListener对象和一个USBEventFilter对象,并通过调用a.exec()来启动Qt事件循环。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Qt中实现USB热插拔检测,可以使用QDeviceWatcher类。QDeviceWatcher是一个用于监测设备插入和移除事件的类。 首先,确保在项目文件(.pro)中添加以下内容以启用Qt的udev库: ```cpp LIBS += -ludev ``` 然后,可以按照以下步骤在Qt中实现USB热插拔检测: 1. 在头文件中包含必要的头文件: ```cpp #include <QObject> #include <QDeviceWatcher> ``` 2. 创建一个类并继承自QObject: ```cpp class USBWatcher : public QObject { Q_OBJECT public: explicit USBWatcher(QObject *parent = nullptr); private slots: void deviceAdded(const QString &devPath); void deviceRemoved(const QString &devPath); private: QDeviceWatcher *m_deviceWatcher; }; ``` 3. 在实现文件中定义构造函数,并在构造函数中初始化QDeviceWatcher对象,并连接相应的槽函数: ```cpp USBWatcher::USBWatcher(QObject *parent) : QObject(parent) { m_deviceWatcher = new QDeviceWatcher(this); connect(m_deviceWatcher, SIGNAL(deviceAdded(QString)), this, SLOT(deviceAdded(QString))); connect(m_deviceWatcher, SIGNAL(deviceRemoved(QString)), this, SLOT(deviceRemoved(QString))); m_deviceWatcher->start(); } ``` 4. 实现设备插入和移除的槽函数: ```cpp void USBWatcher::deviceAdded(const QString &devPath) { // 处理设备插入事件 qDebug() << "Device added: " << devPath; } void USBWatcher::deviceRemoved(const QString &devPath) { // 处理设备移除事件 qDebug() << "Device removed: " << devPath; } ``` 5. 在你的应用程序中实例化USBWatcher对象,并将其保持活动状态: ```cpp int main(int argc, char *argv[]) { QApplication app(argc, argv); USBWatcher usbWatcher; return app.exec(); } ``` 通过以上步骤,你现在可以在`deviceAdded()`和`deviceRemoved()`槽函数中处理设备插入和移除事件。你可以根据需求来执行一些自定义的操作,比如更新UI或者执行特定的任务。 请注意,USB热插拔检测需要在具有相应权限的操作系统上运行,如Linux。在不同的操作系统和平台上,可能需要使用不同的方法来实现设备监测。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值