一、具体流程
用libusb函数库来完成电脑与USB设备的数据交互功能,主要有以下步骤:
1)初始化libusb函数库;
2)根据vid和pid查找某一具体设备,并获取设备描述符;(vid和pid为设备的id,且每台设备的都vid和pid是唯一的)
3)根据设备描述符打开相应设备,获取设备操作符;
4)用设备操作符配置usb设备的配置模式和接口;
5)调用相应传输函数向usb设备发送数据,本项目中用的是块传输方式;
6)调用相应传输函数读取usb设备的反馈数据,本项目中用的是块传输方式;
7)释放usb设备接口,关闭设备。
综上,步骤1、2为初始化操作,步骤3、4为usb设备打开和配置操作,步骤5、6为电脑与usb设备数据传输操作,步骤7为usb设备关闭和释放系统资源操作。
二、代码展示
//打开usb设备 void MainWindow::on_pushButton_clicked() { int r; ssize_t cnt; //libusb_context *ctx=nullptr; //context 上下文 libusb_device **devs; //devices int i=0; if("open"==ui->pushButton->text()) { ui->pushButton->setText("close"); r=libusb_init(&ctx); //init 初始化libusb if(r<0) { qDebug()<pushButton->setText("open"); libusb_release_interface(udev, 0); //释放接口 libusb_close(udev); //关闭设备 libusb_exit(ctx); //退出libusb上下文 udev=nullptr; qDebug()<read_usb(); //读取usb设备的反馈结果 } } //读取usb设备的反馈结果 void MainWindow::read_usb() { unsigned char tmps[50]={0}; int i=0; int read_size_t=25; while(i<2) { int ret=0; ret = libusb_bulk_transfer(udev, 0x82, tmps, read_size_t, &read_size_t,5000); //以块传输方式接收16进制数据 选择端口号为0x84 //libusb_bulk_transfer函数参数解释:设备操作符 端口地址 要接受的数据 预计接受的字节数 实际接受的字节数 超时时间 //libusb_bulk_transfer根据端口决定此时函数是接收还是发送数据 if(ret >= 0) { qDebug() << "success: bulk read " << read_size_t << " bytes"; QString strTmp; QString strOut; for(int i = 0; i < read_size_t; i++) { strTmp.sprintf("%02X ", tmps[i]); strOut.append(strTmp); } qDebug() << strOut; qDebug() << "success"; break; } else { qDebug() << "fail to read"<