• Arm板上usb接口热敏打印机控制


    由于没有厂家的驱动,需要自己对usb口进行控制,主要有两种方式:

    1.手写驱动,加载设备。2.采用libusb库进行无驱动配置

    由于第一种较为麻烦,我采用了第二种。

    主要步骤:

    1.libusb配置:

      官网下载,安装,发现config有问题,先安装依赖项。

      主要参考:https://www.cnblogs.com/ettie999/p/8142973.html

      

    2.测试example里面的listudev.c,可运行代表安装成功

    3.Qt开发:

      1.首先需要在.pro文件中添加路径,用来访问libusb的库:

      INCLUDEPATH += /usr/local/include?libusb-1.0

      LIBS += -L"/usr/local/lib" -lusb-1.0

      2.编写代码:

      

       libusb_context *context = NULL;
        libusb_device_handle *dev_handle = NULL;
        libusb_device **devs;
        libusb_device *dev=NULL;
        int rc = 0;
        ssize_t count;
    
        //*****************Initial *********
        rc = libusb_init(&context);
     //   cout << "rc : " << rc << endl;
        assert(rc==0);
        //Enable debug
    #ifndef NDEBUG
        libusb_set_debug(context,LIBUSB_LOG_LEVEL_WARNING);
    #endif
    
        //Get device list
        count = libusb_get_device_list(context,&devs);
        cout << "count : " << count << endl;
        assert(count>0);
        for(ssize_t idx=0;idx<count;idx++)
        {
            libusb_device *device = devs[idx];
            libusb_device_descriptor desc = {0};
    
            rc = libusb_get_device_descriptor(device,&desc);
            assert(rc ==0);
            if((desc.idVendor == 0x0483) && (desc.idProduct == 0x5743))
            {
                cout << "get the device " << endl;
                dev = device;
            }
           // printf("Vendor:Device =  %04x:%04x
    ",desc.idVendor,desc.idProduct);
            cout << "Vendor:Device = " << hex << desc.idVendor << "___" << desc.idProduct << endl;
        }
    
        //open usb device
        rc = libusb_open(dev,&dev_handle);
        //dev_handle = libusb_open_device_with_vid_pid(context,0x0483,0x5743);
        //dev_handle = libusb_open_device_with_vid_pid(context,0x17ef,0x602d);
        if(dev_handle == NULL)
        {
            cout << "Cann't Open device" << endl;
            return;
        }
        else
            cout << "Open Success " << endl;
      //  assert(dev_handle != NULL);
        //set privilige
    
    
    
        //Write data
        unsigned char *data = new unsigned char[0x30];
        int actual;
        data[0] = 0x0a;
        data[1] = 0x1b;
        data[2] = 0x21;
        data[3] = 0x00;
        data[4] = 0x55;
    
        data[6] = 0x66;
        data[7] = 0x23;
        data[8] = 0x45;
        data[9] = 0x0d;
        data[10] = 0x0a;
    
        if(libusb_kernel_driver_active(dev_handle,0) == 1)
        {
            cout << "Kernel_driver_active" << endl;
            rc = libusb_detach_kernel_driver(dev_handle,0);
            cout << "detach_kernel_driver __rc: " << rc << endl;
            assert(rc==0);
        }
    
        rc = libusb_claim_interface(dev_handle,0);
        cout << "libusb_claim_interface __rc: " << rc << endl;
      //  assert(rc<0);
    
        //  transfer *******
        libusb_config_descriptor* config_descriptor_in = NULL;
        libusb_get_config_descriptor(dev,0,&config_descriptor_in);
    
       // rc = libusb_control_transfer(dev_handle,0x21,0x09,0x0300,0x00,data+1,0x20,10000);
       // rc = libusb_bulk_transfer(dev_handle,(64|LIBUSB_ENDPOINT_OUT),data,4,&actual,0);
        rc = libusb_bulk_transfer(dev_handle,0x02,data,12,&actual,0);
        //rc = libusb_bulk_transfer(dev_handle,config_descriptor_in->interface->altsetting->endpoint->bEndpointAddress,data,4,&actual,10000);
        cout << "libusb_bulk_transfer __rc: " << rc << endl;
        cout << "actual num : " << actual << endl;
        assert(rc!=0 || actual !=5);
    
    
        rc = libusb_release_interface(dev_handle,0);
        cout << "libusb_release_interface __rc: " << rc << endl;
        //assert(rc!=0);
    
        cout << "close devices " << endl;
    
        //Free device list
        libusb_free_device_list(devs,1);
    
        libusb_attach_kernel_driver(dev_handle,0);
        libusb_close(dev_handle);
        libusb_exit(context);
    

      用lsusb可查到usb设备的VID和PID,然后通过官网可以查询对应函数的用法,从而实现控制。

      http://libusb.sourceforge.net/api-1.0/libusb_api.html

     

      

  • 相关阅读:
    第 28 章 CSS3 多列布局
    实例解读什么是Redis缓存穿透、缓存雪崩和缓存击穿
    深入浅出一致性Hash原理
    要想深入理解mysql索引?这16个点你必须要了解!
    为什么不要尝试用int来存手机号?
    mysql-覆盖索引
    聚集索引,非聚集索引,覆盖索引 原理
    mysql use index、ignore index、force index用法
    HashMap在JDK1.8版本尾插法实现解析
    redis slot 槽点
  • 原文地址:https://www.cnblogs.com/Oscar67/p/9185974.html
Copyright © 2020-2023  润新知