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主从. ...
随机推荐
- 要源码的快来啊,价值500的OA商业源码免费送给大家,望大家年底奖金多多......
功能介绍: 兼容IE6,7,8以上.GooleChrome.360及遨游等浏览器. 系统特色: 1.系统经过抗压测试. 2.语音提示功能. 3.支持office2007在线编辑. 4.强大的图形化工作 ...
- android显示手机电量
package com.basillee.asus.demo; import android.app.Notification; import android.content.BroadcastRec ...
- hive metastore异常 org.apache.thrift.protocol.TProtocolException: Missing version in readMessageBegin, old client
hiveserver2的端口是10000hive.metastoe.uris 的端口9083改为10000之后 beelien 连接hiveserver2报错 Error: Could not ope ...
- 浅析foreach原理
在日常开发工作中,我们发现很多对象都能通过foreach来遍历,比如HashTable.Dictionary.数组等数据类型.那为何这些对象能通过foreach来遍历呢?如果写一个普通的Person类 ...
- Centos搭建PHP5.3.8+Nginx1.0.9+Mysql5.5.17
操作环境 操作系统:Mac Os Lion 虚拟主机:VMware Fusion 虚拟系统:Centos 5.5+ 操作用户:Root 实现目的:搭建LNMP环境. 安装依赖库和开发环境 #依赖库和开 ...
- Easyui tabs的herf和content属性
在backstage.jsp页面中我写了一个方法,用于在指定位置添加面板(id为msg的地方)function addTab(t,h){ if($('#msg').tabs('exists',t)){ ...
- 11_Servlet基础知识
[概念] Servlet通常被称为服务端小程序,是运行在服务端的程序,用于处理及相应客户端的请求. Servlet是用java语言开发网页动态资源的技术. [特点] 1.Servlet是个特殊的Jav ...
- 暑假集训(2)第六弹 ----- Frosh Week(UVA11858)
H - Frosh Week Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:32768KB ...
- 避免ajax请求过多,导致内存溢出,请求之后回收资源
php试题网 http://phpshiti.com/ http://www.jb51.net/article/30458.htm success: function (data, textStatu ...
- 通过正则表达式获取url中参数
url: http://xxxx.com?name=魅力&id=123 js中: var name = getUrlParam("name"); /*通过正则获取url中的 ...