Android USB Host 与 Hid 设备通信bulkTransfer()返回-1问题的原因

时间:2021-02-06 16:11:49

        近期一直在做Android USB Host 与USB Hid设备(STM32FXXX)的通信,遇到了很多问题。项目源码以及所遇到的其他问题可以见本博客其他相关文章,这里重点讲一下bulkTransfer()返回-1问题。

        在百度上搜索,可以看到很多人也遇到了类似问题,按照“标准”例程写了代码,其他的步骤都没问题(getDeviceList()、openDevice()等等),就是到了bulkTransfer()这一步总是返回小于0的值(-1)。看网上的回复,解决方法也是各种各样,比如:检查端点有没有配置正确;看自己的Hid设备的程序,要对应上……。但笔者的程序经过仔细检查,不存在以上问题:端点已经配置正确;Hid设备不需要先收,而是直接发数据给Android。那么问题到底出在哪里呢?

        笔者也曾一度陷入迷茫,有病乱投医似地想了很多导致问题的可能性以及尝试方案:1. Android SDK是否不支持中断端点的收发?因为函数只有bulkTransfer()和controlTransfer(),明显是基于批量和控制端点的,对于Hid设备所基于的中断端点是不是根本不支持;2. 中断端点的In、Out是否弄混? 3. 用网上发出的现成代码(阿莫电子网中有和笔者工程非常类似的工程的全部代码)。对于1,不确定,网上也没有明确说明,只是根据很多既成项目的帖子感觉应该不存在这个问题;对于2,确认没有弄混;对于3,由于阿莫中是基于STM32F4XXX的工程,而自己的项目是基于STM32F3XXX的,若改起来相当麻烦,只能看看两个项目的源码上的区别。

        好了,到此为止直接“捞干的”,不再说一些“汤汤水水”了。问题的解决源自于一次灵光一现的尝试,原本代码中的函数是这样调用的:

    if (myDeviceConnection.bulkTransfer(epIntIn, recvBuffer, 4, 0) < 0)

        看了STM单片机的程序,发现它每次发送64字节,于是猜测是不是应该接收全部64个字节,于是将代码改为:

    if (myDeviceConnection.bulkTransfer(epIntIn, recvBuffer, 64, 0) < 0)

        再次运行程序,这次可以正常收到数据了!

        将64改为63,现象和之前错误时一样。看来应该不小于64,否则就会出错。

        那么大于64行不行呢?经过验证是可以的。

        那么如果下层单片机程序每次只发4个字节,情况会怎么样呢?

        经过验证,只要bulkTransfer()中传递的数据长度不小于4,函数就正确,程序就正常运行。

        经过以上尝试,得出以下结论:

   bulkTransfer()中传入的长度值必须要根据下位机每次发送的数据长度来调整,不能小于这个数据长度!