前面获取到了设备信息,现在开始可以进行设备的打开与关闭操作了。本文继续实现设备打开与关闭的逻辑。
参考examples/xusb.c.
设备打开
定义全局变量设备句柄和设备指针
libusb_device_handle *s_opened_handle = NULL;
libusb_device *s_opened_dev = NULL;
打开设备
usbdev.c中实现
int usbdev_open(int index)
{
int vid;
int pid;
printf("index=%d,s_devs_num=%d\r\n",index,s_devs_num);
if(index >= s_devs_num)
{
return -1;
}
if(s_opened_handle != NULL)
{
return 0;
}
sscanf(s_devs_str[index],"%04x:%04x",&vid,&pid);
s_opened_handle = libusb_open_device_with_vid_pid(NULL, vid, pid);
if (s_opened_handle == NULL)
{
fprintf(stderr, "Open device %d vid:%x,pid:%x failed.\n",index,vid,pid);
return -2;
}
else
{
printf("dev opened\r\n");
}
s_opened_dev = libusb_get_device(s_opened_handle);
uint8_t bus = libusb_get_bus_number(s_opened_dev);
return 0;
}
关闭设备
int usbdev_close(void)
{
if(s_opened_handle != NULL)
{
libusb_close(s_opened_handle);
s_opened_handle = NULL;
printf("dev closed\r\n");
}
return 0;
}
获取设备是否已经打开
int usbdev_get_openstatus(void)
{
printf("get dev status\r\n");
if(s_opened_handle == NULL)
{
return 0;
}
else
{
return 1;
}
}
usbdev.h中声明这3个接口
int usbdev_open(int index);
int usbdev_close(void);
int usbdev_get_openstatus(void);
给打开按钮添加处理函数,即点击按钮如果打开设备成功,修改为显示”关闭”,
再次点击则关闭设备,限时”打开”。
void MainWindow::on_pushButton_clicked()
{
}
实现如下
void MainWindow::on_pushButton_clicked()
{
int index = ui->comboBox->currentIndex();
if(index < 0)
{
return;
}
if(0 == usbdev_get_openstatus())
{
printf("to open dev %d\r\n",index);
if(0 == usbdev_open(index))
{
ui->pushButton->setText("关闭");
}
}
else
{
usbdev_close();
ui->pushButton->setText("打开");
}
}
下载zadig
https://zadig.akeo.ie/
以管理员身份打开zadig-2.8.exe
菜单栏点击Options->List All Devices
选择对应的设备,我这里是一个PL2303的USB转串口线,选择驱动libusb,替换驱动
运行我们的程序
这里测试发现如果不手动关闭设备会导致下次无法打开,
所以在程序退出时检查下是否需要关闭设备。
修改usbdev_deinit
int usbdev_deinit(void)
{
usbdev_close();
libusb_exit(NULL);
return 0;
}
以上完成了设备的打开与关闭的逻辑,后面就开始可以进行接口和端点信息的解析,进行传输逻辑的开发了。