由于没有厂家的驱动,需要自己对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\n",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