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主从. ...
随机推荐
- 使用PHP连接、操纵Memcached的原理和教程
http://www.crazyant.net/1014.html Memcahced开源分布式内存对象缓存系统通过减少数据库的负担,从而能够加速你的web应用.在本文中我将解释怎样实现一个基于Mem ...
- redirect_uri参数错误解决方法
坑,微信改来改去的,找死人了,以前在“开发者中心”中,现在改在”接口权限“中了.
- solr-tomcat 中文乱码
<Connector URIEncoding="UTF-8" port="8080" protocol="HTTP/1.1" conn ...
- unity访问php
长连接,弱联网.不好意思,这俩不是一个意思. 反过来说,短连接,强联网,是不是有点别扭呢. 你可以不会php,甚至你可以不知道php是干什么的. 百度php安装环境,自行搭建好环境,顺便测试一下.(下 ...
- 基础之ThreadStatic
public class Bean { public Bean() { } public static String Current { get { if (guid == null) guid = ...
- CSS FIXED porn javhd
CSS position property - W3Schools W3Schools › cssref › pr_class_position Definition and Usage. The p ...
- C++实用数据结构:二叉索引树
看下面这个问题(动态连续和查询): 有一个数组A(长度为n),要求进行两种操作: add(i,x):让Ai增大x: query(a,b):询问Aa+Aa+1+...+Ab的和: 若进行模拟,则每次qu ...
- WIX Custom Action (immediate, deffered, rollback)
Following content is directly reprinted from From MSI to WiX, Part 19 - The Art of Custom Action, Pa ...
- NFS vs. CIFS
1. CIFS协议分析 CIFS(Common Internet File System,公共互联网文件系统)是当前主流异构平台共享文件系统之一.主要应用在NT/Windows环境下,是由Micro ...
- libpcap 主要函数及过程详解
http://blog.chinaunix.net/uid-21556133-id-120228.html libpcap(Packet Capture Library),即数据包捕获函数库,是Uni ...