Android USB Host 与 Hid 设备通信bulkTransfer()返回-1问题的原因
近期一直在做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问题的原因的更多相关文章
- Android USB Host 与 HID 之通讯方法(bulkTransfer()与controlTransfer()方法使用)
转载地址:差满多乃几 Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两 ...
- Android USB Host与HID通讯
前端时间捣鼓一个HID的硬件, 需要和android通信, 网上搜索了一圈,收获不小. 比较好的文章是: Android USB Host与HID通讯 Android Service创建US ...
- Android USB Host与HID通讯 (二)
不好意思,从上一篇到现在确实比较忙,中间又外出了一段时间,虽然也上LOFTER,或者看到一些朋友QQ上加我,给我发信息询问,有些看到了有些可能没看到,偶尔回复了一两个,也不咋的详细,在此我想说,一方面 ...
- Android USB Host 与 HID 之通讯方法
Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两个方法,要实现真正的通 ...
- Android USB Host与HID通讯 (一)
去年9月份来到现在的公司,接到新公司的第一个项目就是Android USB Host与HID通讯,当时也什么都不懂,就拿着google的api 开发指南 (http://developer.andro ...
- 翻译Android USB HOST API
翻译Android USB HOST API 源代码地址:http://developer.android.com/guide/topics/connectivity/usb/host.html 译者 ...
- android usb Host模式下与usb Hid 设备的通信
做android 与USB HID设备的通信有段时间了,总结一下遇到的问题和解决方法: 1,第一次遇到的问题:android 版本低不支持usb hid, 被要求做相关项目的时候,就从mUsbMana ...
- Android USB Host 通信程序
换到了一家新公司,于是就有了新的项目.这次的项目 要用Android SDK与USB HID设备进行通信.第一次接触Android SDK,以及USB,记录下源程序.开发过程以及一些心得. 首先,要感 ...
- Android笔记5-与USB HID 设备通信(一)
1.了解 支持USB 主机(host)或者从机(accessary )模式最终是取决于设备的硬件,而与平台版本无关.我们可以通过usesfeature这个方法来查询自己的设备是否支持USB主从. ...
随机推荐
- poj3660 Cow Contest(Floyd-Warshall方法求有向图的传递闭包)
poj3660 题意: 有n头牛, 给你m对关系(a, b)表示牛a能打败牛b, 求在给出的这些关系下, 能确定多少牛的排名. 分析: 在这呢先说一下关系闭包: 关系闭包有三种: 自反闭包(r), 对 ...
- C#集合之Hashtable
Hashtable是一个键值对集合,其泛型版本是Dictionary<K, V>,下面说下常用的一些方法; 1.Add(),向Hashtable添加元素,需要注意的是因为它是键值对集合,所 ...
- AWK 脚本编写习惯
教训总结: 不能忽略了脚本语言的编写规范! 创建数组的时候初始化,特别是在for循环中使用的数组: u_count[; g_count[; 认真对待对象,特别是数组的命名: username_to_d ...
- iOS App Transport Security
网络请求提示:Application Transport Security has blocked a cleartext HTTP (http://) resource load since it ...
- 11_Jaxws常用注解
[不使用注解] 默认namespace是服务类包名的倒序 默认portType是服务类的类名 ............... 注解的所起的作用: Jaxws提供的注解可以对WebService的接口规 ...
- MySql的安装与使用
今天因为毕业设计要用到MySql数据库,所以就准备自己安装一个MySQL数据库,但是因为MySQL Install MSI只有32位,所以最后选择使用Windows (x86, 64-bit), ZI ...
- mysql5.7的安装
1.在官网下载解压缩版 2.解压后配置默认文件 新建个my.ini(可以复制一份my-default.ini,并改名为my.ini).my.ini会替换掉下面的my-default.ini文件. 按需 ...
- Python3 内建模块 hashlib、itertools、HTMLParser、urllib
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制 ...
- C# 创建XML文档
有些时候我们需要生成一个xml文档作为数据交换的容器.当然我们用拼接字符串的方法来进行构建xml,但是这种方法虽然简单有效,但是如果xml文档结构过于复杂,拼接字符串会让人眼花缭乱.这时候就需要C#给 ...
- live 写博
1 2 3 4 5 1 2 3 4 5 ...