近期一直在做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()中传入的长度值必须要根据下位机每次发送的数据长度来调整,不能小于这个数据长度!

Android USB Host 与 Hid 设备通信bulkTransfer()返回-1问题的原因的更多相关文章

  1. Android USB Host 与 HID 之通讯方法(bulkTransfer()与controlTransfer()方法使用)

    转载地址:差满多乃几 Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两 ...

  2. Android USB Host与HID通讯

    前端时间捣鼓一个HID的硬件, 需要和android通信, 网上搜索了一圈,收获不小. 比较好的文章是:      Android USB Host与HID通讯 Android Service创建US ...

  3. Android USB Host与HID通讯 (二)

    不好意思,从上一篇到现在确实比较忙,中间又外出了一段时间,虽然也上LOFTER,或者看到一些朋友QQ上加我,给我发信息询问,有些看到了有些可能没看到,偶尔回复了一两个,也不咋的详细,在此我想说,一方面 ...

  4. Android USB Host 与 HID 之通讯方法

    Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两个方法,要实现真正的通 ...

  5. Android USB Host与HID通讯 (一)

    去年9月份来到现在的公司,接到新公司的第一个项目就是Android USB Host与HID通讯,当时也什么都不懂,就拿着google的api 开发指南 (http://developer.andro ...

  6. 翻译Android USB HOST API

    翻译Android USB HOST API 源代码地址:http://developer.android.com/guide/topics/connectivity/usb/host.html 译者 ...

  7. android usb Host模式下与usb Hid 设备的通信

    做android 与USB HID设备的通信有段时间了,总结一下遇到的问题和解决方法: 1,第一次遇到的问题:android 版本低不支持usb hid, 被要求做相关项目的时候,就从mUsbMana ...

  8. Android USB Host 通信程序

    换到了一家新公司,于是就有了新的项目.这次的项目 要用Android SDK与USB HID设备进行通信.第一次接触Android SDK,以及USB,记录下源程序.开发过程以及一些心得. 首先,要感 ...

  9. Android笔记5-与USB HID 设备通信(一)

    1.了解 支持USB 主机(host)或者从机(accessary )模式最终是取决于设备的硬件,而与平台版本无关.我们可以通过usesfeature这个方法来查询自己的设备是否支持USB主从.   ...

随机推荐

  1. Android studio 删除Module、project

    很简单: 1 选中项目右键:Open Module Setting 2 选择要删除的项目,点击“-”即可

  2. Extjs搜索域使用

    要在使用的panel在预先加载搜索域类requires : ["Ext.ux.form.SearchField"],

  3. iOS获取webview高度

    int webHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.scr ...

  4. OC1_汉字拼音转换 练习

    // // WordManager.h // OC1_汉字拼音转换 // // Created by zhangxueming on 15/4/27. // Copyright (c) 2015年 z ...

  5. HDU 4762 Cut the Cake

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4762 题目大意:将n个草莓随机放在蛋糕上,草莓被看做是点,然后将蛋糕平均切成m份,求所有草莓在同一块蛋 ...

  6. [LCA & RMQ] [NOIP2013] 货车运输

    首先看到这题, 由于要最大, 肯定是求最大生成树 那么 o(n2) dfs 求任意点对之间的最小边是可以想到的 但是看看数据范围肯定TLE 于是暴力出来咯, 不过要注意query的时候判断的时候要 m ...

  7. 第12条:考虑实现Comparable接口

    CompareTo方法没有在Object中声明,它是Comparable接口中的唯一的方法,不但允许进行简单的等同性比较,而且允许执行顺序比较.类实现了Comparable接口,就表明它的实例具有内在 ...

  8. MySQL生产库主从重新同步操作注意事项

    因为一些原因,我们会遇到生产主从库重新同步的时候.重新同步MYSQL主从的时候有有一些注意的地方. 从库还原前一定要记得reset,因为重启mysql并不影响复制进程,如果忘记reset,会导致你一边 ...

  9. RabbitMQ RPC问题

    1.服务器端代码:https://github.com/rabbitmq/rabbitmq-tutorials/blob/master/python/rpc_server.py 2.客户端代码:htt ...

  10. hdu 5055 Bob and math problem

    先把各个数字又大到小排列,如果没有前导零并且为奇数,则直接输出.如果有前导零,则输出-1.此外,如果尾数为偶数,则从后向前找到第一个奇数,并把其后面的数一次向前移动,并把该奇数放到尾部. 值得注意的是 ...