Linux libusb USB开发(四)―― libusb例程,Linux环境下实现PC与USB设备的交互通信 (用的QT C++)

匿名 (未验证) 提交于 2019-12-02 21:56:30

一、具体流程

用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()<<"failed to init libusb";  //fail to init libusb             return;         }           cnt = libusb_get_device_list(nullptr, &devs); //获取设备列表         if (cnt < 0) {             qDebug()<<"failed to get device list";  //fail to get device_list             return;         }           //遍历查找你要的设备         while ((dev = devs[i++]) != nullptr) {                 struct libusb_device_descriptor desc;  //设备信息描述符                   r= libusb_get_device_descriptor(dev, &desc); //获取设备信息描述符                 if (r < 0) {                     qDebug()<<"failed to get device descriptor";  //fail to get device descriptor                     return;                 }                   if(desc.idVendor==0x0472 && desc.idProduct==0xA181) //根据vid和pid查找某一具体设备                 {                     r=libusb_open(dev,&udev); //打开设备,获取设备操作符                     if(r<0) {                         qDebug()<<"failed to open device";  //fail to open device                         qDebug()<<libusb_error_name(r)<<" "<<r;                         qDebug()<<"udev:"<<udev;                         return;                     } else {                         qDebug()<<"open device successfully";  //success to open device                         qDebug()<<"udev:"<<udev;                     }                     break;                 }             }           //libusb规定在用设备操作符发送数据前,需设置usb设备的配置模式和接口         if ((r=libusb_set_configuration(udev, 1)) < 0) {  //设置usb设备配置模式为1             qDebug("error setting config #1: %s",  libusb_error_name(r));             exit(1);         }         if ((r=libusb_claim_interface(udev, 0)) < 0) {   //设置usb设备接口为0             qDebug("error claiming interface #0:\n%s", libusb_error_name(r));             exit(1);         }     }     else     {         ui->pushButton->setText("open");         libusb_release_interface(udev, 0); //释放接口         libusb_close(udev);  //关闭设备         libusb_exit(ctx);  //退出libusb上下文           udev=nullptr;           qDebug()<<"close usb";     } } 
 //发送指令 void MainWindow::on_pushButton_2_clicked() {     int r = 0;     int outsize=0;         unsigned char a[10] = {0x3A, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0D};       outsize=sizeof(a);       r=libusb_bulk_transfer(udev,0x01,a,outsize,&outsize,5000);  //以块传输方式发送16进制数据 选择端口号为0x01     //libusb_bulk_transfer函数参数解释:设备操作符 端口地址 要发送的数据 预计发送的字节数 实际发送的字节数 超时时间       if (r < 0)     {         qDebug() << "error writing:";         qDebug() << libusb_error_name(r);     }     else     {         qDebug() << "success: bulk write " << outsize <<  " bytes";         qDebug() << "3A 01 00 00 00 00 00 00 01 0D";         this->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"<<ret;             qDebug() << "error reading:";             qDebug() << libusb_error_name(ret);         }         i++;     }     qDebug() << "finish2"; } 

https://blog.csdn.net/jiguangfan/article/details/86577784

文章来源: https://blog.csdn.net/qq_31094099/article/details/90230015
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!