在qt环境中,写出完整libusb 异步传输例程,使用多线程读写操作,使用c++实现,封装成一个类,并在主界面调用,显示发送和接收的数据
时间: 2024-10-09 07:05:21 浏览: 21
在Qt环境中,利用libusb库进行异步数据传输并结合多线程,可以按照以下步骤实现一个简单的USB设备通信类。首先确保已安装了`libusb-dev`库和Qt的QThread模块。
```cpp
#include <QObject>
#include <QThread>
#include <QQueue>
#include <libusb/libusb.h>
class UsbDevice : public QObject
{
Q_OBJECT
public:
explicit UsbDevice(libusb_device* device, QObject *parent = nullptr);
~UsbDevice();
void sendData(QByteArray data);
QByteArray receiveData();
signals:
void dataSent(const QByteArray& sentData);
void dataReceived(const QByteArray& receivedData);
private:
libusb_device* m_device;
QThread* m_workerThread;
QQueue<QByteArray> m_sendQueue;
QQueue<QByteArray> m_receiveQueue;
private slots:
void sendThreadFunction();
void receiveThreadFunction();
private:
// 使用QMutex对队列进行同步,防止多线程访问时出错
QMutex m_queueMutex;
};
// 类构造函数
UsbDevice::UsbDevice(libusb_device* device, QObject *parent)
: QObject(parent), m_device(device), m_workerThread(nullptr)
{
if (m_device) {
m_workerThread = new QThread(this);
connect(m_workerThread, &QThread::started, this, &UsbDevice::sendThreadFunction);
connect(&m_sendQueue, &QQueue::emptied, this, &UsbDevice::receiveThreadFunction);
startWorkerThread();
}
}
// 类析构函数
UsbDevice::~UsbDevice()
{
stopWorkerThread();
delete m_workerThread;
}
void UsbDevice::sendData(QByteArray data)
{
if (!m_workerThread->isRunning()) {
startWorkerThread();
}
m_sendQueue.enqueue(data);
emit dataSent(data);
}
QByteArray UsbDevice::receiveData()
{
QMutexLocker locker(&m_queueMutex);
return !m_receiveQueue.isEmpty() ? m_receiveQueue.dequeue() : QByteArray();
}
void UsbDevice::startWorkerThread()
{
if (!m_workerThread->isRunning()) {
m_workerThread->start();
}
}
void UsbDevice::stopWorkerThread()
{
if (m_workerThread && m_workerThread->isRunning()) {
m_workerThread->quit();
m_workerThread->wait();
}
}
// 发送线程函数
void UsbDevice::sendThreadFunction()
{
while (!m_workerThread->isInterruptionRequested()) {
QByteArray data;
{
QMutexLocker locker(&m_queueMutex);
if (!m_sendQueue.isEmpty()) {
data = m_sendQueue.dequeue();
} else {
qSleep(100); // 等待队列中有数据
}
}
if (!data.isEmpty()) {
// 在这里添加libusb的异步发送代码,比如使用libusb_transfer_async等
// 具体实现会依赖于libusb的具体API,这里省略实际的USB操作
}
}
}
// 接收线程函数
void UsbDevice::receiveThreadFunction()
{
while (!m_workerThread->isInterruptionRequested()) {
QByteArray data;
{
QMutexLocker locker(&m_queueMutex);
if (!m_receiveQueue.isEmpty()) {
data = m_receiveQueue.dequeue();
emit dataReceived(data);
} else {
qSleep(100); // 等待数据到达
}
}
}
}
// 主界面调用部分(简化示例)
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
connect(ui->sendButton, &QPushButton::clicked, this, &MainWindow::sendDataToDevice);
connect(ui->receiveButton, &QPushButton::clicked, this, &MainWindow::showReceivedData);
}
// 发送按钮点击事件处理
void MainWindow::sendDataToDevice()
{
QByteArray data("Hello from UI!");
usbDevice.sendData(data);
}
// 显示接收到的数据
void MainWindow::showReceivedData()
{
QByteArray receivedData = usbDevice.receiveData();
qDebug() << "Received data: " << receivedData;
}
```
在这个例子中,我们创建了一个`UsbDevice`类,它负责管理异步传输操作。通过`QThread`实现了发送和接收数据的线程安全。在主界面中,你可以通过按钮触发发送和接收数据的操作。