首页 > 技术知识 > 正文

libusb开发通讯问题

本篇文章继续记录使用libusb通讯是遇到的问题 问题描述: 使用libusb与一台新的虚拟串口下位机通讯,扫描、打开、关闭都是正常的,就是无法收发数据,也没有报错,这是为什呢,检查了usb驱动,虚拟串口驱动已经被安装成usb驱动,没有问题,我又换一种虚拟串口的设备试一试,没有问题,所以代码是没有错误的,是不是有哪些设置没有设好,这里暂且称两台设备为A(使用libusb无法通讯的虚拟串口设备)、B(使用libusb可以通讯的虚拟串口设备);我又使用串口工具与这两种设备通讯,发现使用串口工具也没法与A设备通讯了,B设备依然是正常的,这时候我就怀疑是不是A设备是坏的,所以就去找A设备开发工程师,问他是不是设备坏了,但是他在他电脑上使用串口工具通讯是正常的,这就奇怪了,这时候我发现我和他使用的串口工具不同,所以我就把他的串口工具拷贝到我的电脑上试一试,发现使用他的串口工具就是好的,这时候我大概找到原因了,我仔细对比两个串口工具发现了不同,一个串口工具设置的DTR、RST,一个没有设置,因此导致串口通讯失败,所以我就查找使用libusb设置DTR、RST的方法,设置DTR、RST后果然通讯正常了。 设置是使用控制传输设置的,设置代码:

int rc = libusb_control_transfer(dHand, 0x21, 0x22, 0x02 | 0x01, 0, nullptr, 0, 10); if (rc < 0) { fprintf(stderr, “Error during control transfer: %s\n”, libusb_error_name(rc)); }

在设备打开后添加以上代码就可以正常通讯了。 根据以上代码设备是可以正常通讯了,可是使用了一段时间后又出现问题了,真的是一个坑填上又出现一个,永远都是填不完的坑啊。 问题描述: 手动插拔设备时是没有问题的,一切都很正常,但是使用软件关闭设备通讯,再次打开设备是就打开不了,使用debug单步调试发现,问题出现在DTR、RST上面,软件关闭设备通讯后再次打开设备这只DTR、RST时就会阻塞在里面无法退出,就算加了超时也没有。 我在想是不是关闭设备的时候没有禁用DTR、RST才导致这个问题,于是我在关闭前禁用DTR、RST:

int rc = libusb_control_transfer(dHand, 0x21, 0x22, 0x00, 0, nullptr, 0, 10); if (rc < 0) { fprintf(stderr, “Error during control transfer: %s\n”, libusb_error_name(rc)); }

经验证,禁用DTR、RST还是没用,这是为很么呢,百思不得其解,于是我就去查找各种关于使用libusb设置DTR、RST的资料,最后终于在GitHub让我找到了,是在GitHub中一个js使用libusb的工程中发现了,那里面有使用libusb设置DTR、RST的完整步骤,具体是哪个工程不记得了,研究了下这个工程中的使用步骤发现原来我设置DTR、RST时使用的接口传参传错了,但是我很好奇的是为什么传错参数了还可以正常通讯,一直没想明白(想不明白就先不想了),正确的传参是:libusb_control_transfer第五个参数应该是通讯的接口号。 使能DTR、RST:

int rc = libusb_control_transfer(dHand, 0x21, 0x22, 0x02 | 0x01, interfaceNumber, nullptr, 0, 10); if (rc < 0) { fprintf(stderr, “Error during control transfer: %s\n”, libusb_error_name(rc)); } //禁用DTR、RST: int rc = libusb_control_transfer(dHand, 0x21, 0x22, 0x00, interfaceNumber, nullptr, 0, 10); if (rc < 0) { fprintf(stderr, “Error during control transfer: %s\n”, libusb_error_name(rc)); }

猜你喜欢