在qt环境中,写出完整libusb 同步传输例程,使用多线程读写操作,使用c++实现,封装成一个类,并在主界面调用,显示发送和接收的数据
时间: 2024-10-09 14:05:08 浏览: 179
在Qt环境中,使用libusb库进行同步传输并结合多线程处理读写操作,首先需要安装libusb库并包含相应的头文件。以下是一个基础的例子,我们将创建一个名为`UsbDevice`的类,它包含了读写数据的方法以及多线程处理。请注意,这个例子假设你已经对Qt和libusb有基本了解。
```cpp
#include <QThread>
#include <QMutex>
#include <QObject>
#include <QPair>
#include <libusb.h>
class UsbDevice : public QObject
{
Q_OBJECT
public:
explicit UsbDevice(libusb_device* device, QObject *parent = nullptr);
~UsbDevice();
void sendData(const char* data, int length);
QByteArray receiveData(int length);
signals:
void sentDataSignal(const QPair<int, QByteArray>& data);
void receivedDataSignal(const QPair<int, QByteArray>& data);
private slots:
void readThreadFunction();
void writeThreadFunction();
private:
libusb_device* m_device;
QMutex m_dataLock;
QThread* m_readerThread;
QThread* m_writerThread;
QByteArray mDataToWrite;
QByteArray mDataReceived;
};
// 类的构造函数
UsbDevice::UsbDevice(libusb_device* device, QObject *parent) : QObject(parent)
{
m_device = device;
// 初始化线程
m_readerThread = new QThread(this);
connect(m_readerThread, &QThread::finished, this, &UsbDevice::deleteLater);
m_writerThread = new QThread(this);
connect(m_writerThread, &QThread::finished, this, &UsbDevice::deleteLater);
}
// 类的析构函数
~UsbDevice()
{
if (m_readerThread->isRunning())
m_readerThread->quit();
if (m_writerThread->isRunning())
m_writerThread->quit();
m_readerThread->wait();
m_writerThread->wait();
}
// 发送数据
void UsbDevice::sendData(const char* data, int length)
{
// 将数据复制到内部缓冲区
QMutexLocker locker(&m_dataLock);
mDataToWrite.resize(length);
memcpy(mDataToWrite.data(), data, length);
// 在新线程中开始写入
if (!m_writerThread->isRunning()) {
m_writerThread->start();
connect(m_writerThread, &QThread::started, [this]() { sendDataTask(); });
}
}
// 读取数据任务
void UsbDevice::sendDataTask()
{
Q_ASSERT(!m_writerThread->isFinished());
Q_ASSERT(!m_readerThread->isRunning());
libusb_transfer* transfer = libusb_alloc_transfer(0);
libusb_fill_bulk_transfer(transfer,
m_device,
LIBUSB_ENDPOINT_IN,
(unsigned char*)mDataReceived.data(),
mDataToWrite.size(),
NULL, // callback function
0, // flags
1000); // timeout in milliseconds
int result;
while ((result = libusb_submit_transfer(transfer)) != LIBUSB_TRANSFER_COMPLETED) {
// handle errors and timeouts
}
// 线程结束时发出信号
emit sentDataSignal({transfer->actual_length, QByteArray(mDataReceived.data(), transfer->actual_length)});
}
// 接收数据
QByteArray UsbDevice::receiveData(int length)
{
QByteArray buffer(length);
libusb_transfer* transfer = libusb_alloc_transfer(0);
libusb_fill_bulk_transfer(transfer,
m_device,
LIBUSB_ENDPOINT_OUT,
buffer.data(),
length,
NULL, // callback function
0, // flags
1000); // timeout in milliseconds
int result;
while ((result = libusb_submit_transfer(transfer)) != LIBUSB_TRANSFER_COMPLETED) {
// handle errors and timeouts
}
return buffer;
}
// 开始读取线程
void UsbDevice::readThreadFunction()
{
while (true) {
// 读取数据,然后在锁保护下更新
QByteArray newData = receiveData(1024); // 每次读取1KB
QMutexLocker locker(&m_dataLock);
mDataReceived.append(newData);
// 发出接收到数据的信号
emit receivedDataSignal({newData.size(), newData});
QThread::sleep(1); // 避免过于频繁地读取
}
}
// 开始写入线程
void UsbDevice::writeThreadFunction()
{
sendDataTask();
}
// 主界面调用
// ...
```
在主界面,你可以这样实例化并调用`UsbDevice`:
```cpp
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
libusb_context* ctx = libusb_init(nullptr);
libusb_device_list* devices = libusb_get_device_list(ctx, nullptr);
libusb_device* device = libusb_get_device_by_index(ctx, 0); // 获取设备
// 创建UsbDevice实例并启动线程
UsbDevice* dev = new UsbDevice(device);
dev->moveToThread(&thread);
thread.start();
// 在适当的时候调用sendData和receiveData方法
delete devices;
libusb_exit(ctx);
return app.exec();
}
```
阅读全文
相关推荐


















