一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)

一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)0背景1.手机USB接口通信特点-1.1使用方便-1.2通用性强-1.3速度快-1.4可采用总线供电2.手机USB接口通信原理-2.1常见手机USB接口-2.2通信过程-2.3体系架构2.4软件层次3.手机USB接口与外设通信方案-3.1USB(手机)USB(外设)-3.1.1USBHost简述

大家好,又见面了,我是你们的朋友全栈君。


更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,共同探讨软件知识经验,关注就有海量学习资料免费领哦:

在这里插入图片描述



针对手机与外部设备通信,仅有USB与音频接口可以使用,而由于iOS手机不支持OTG功能。因此,本文主要对Android手机通过USB接口与外设通信进行介绍。音频接口部分可参考文档http://blog.csdn.net/howiexue/article/details/79145048 。


0背景

– 随着移动互联网技术的迅猛发展,两大主流智能移动设备iOS 和Android占据了绝对的市场,除了基本的通话、娱乐功能之外,这些移动设备已经成为新时代中重要的信息终端设备节点。
– 通用串行总线(USB)目前已经成为了最标准的接口,用于提供系统一个可靠且低成本的数字连接,目前在使用方面已经超越了电脑的范畴,并已广泛应用在工业、医疗、消费电子、通信网络等等。
– RS232接口长期广泛存在于在各种应用领域,随着安卓手机平板的大量上市,安卓系统下通过USB转RS232接口接入外设的应用需求也开始变得强烈起来。

市面上现有的手机USB接口与外设通信实例:
在这里插入图片描述

图1 手机U盘
在这里插入图片描述

图2 手机USB摄像头


1.手机USB接口通信特点

1.1 使用方便

即插即用,可热插拔,具有自动配置能力,用户只要简单地将外设插人到手机就能自动识别和配置uSB设备。

1.2 通用性强

目前安卓手机、平板都具备USB接口,连 接灵活,易扩展。

1.3 速度快

  • USB2.0 :理论速度是每秒480Mbps(约每秒60MB)
  • USB3.0 :理论速度能够达到每秒5Gbps(约为每秒625MB)

1.4 可采用总线供电

USB2.0总线提供最大达5v电压、500mA电流,USB3.0 可达1A。大部分USB外设无需单独的供电系统。

由于 USB 的诸多特点,在PC的外围设备中,取代了大部分传统的接口。但在智能仪器仪表中,还大量地使用RS一232C接口。随着智能仪器仪表控制系统的日益复杂,数据采集量的增大,迫切需要寻求一种更高速、安全、方便的通信形式。USB接口的特点,恰好满足这种应用要求,USB产品进人智能仪器仪表和工业控制领域将是必然的。


2. 手机USB接口通信原理

USB通讯协议十分复杂,这里不赘述,只简要介绍基本知识。

2.1 常见手机USB接口

在这里插入图片描述

图3 常用USB接口图
如上图,包括常见的Standard Type-A、Type-B、Micro等接口
其中Micro USB接口是USB 2.0标准的一个便携版本,支持OTG,目前除苹果公司产品之外,先进市面上几乎所有的移动设备都采用了Micro-USB接口。
一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)

图4 Micro USB接口图
这里写图片描述
图5 各USB 版本传输速率与输出电流对比

2.2 USB通信过程

在这里插入图片描述

图5 USB通信过程
一般的USB主机和设备之间遵循主从通信的原理,每一次的数据传输都是又主机发起。如果主机要输出数据,则先发一个握手包,通知设备。然后发送数据,设备接收到数据后,再发送一个确认包。如果主机要输入数据,也是先发一个握手包,通知设备。设备然后将准备好的数据发送给主机。主机再给设备一个确认包。

2.3 体系架构

从物理结构上,USB系统是一个星形结构。其包含三类硬件设备: USB主机(USB HOST)、 USB设备(USB DEVICE)和USB集线器(USB HUB)。
USB总线上的物理连接是一个分层的星形拓扑,处于每个星形拓扑中央的是HUB集线器,在主机与HUB之间,HUB与HUB之间,HUB与设备之间都是点对点的连接。

在这里插入图片描述

图6 USB整体架构

USB HOST对USB系统进行管理、每毫秒产生一帧数据、发送配置请求对USB设备进行配置、管理和恢复总线上的错误。
USB HUB用于设备扩展连接,所有USB DEVICE都连接在USB HUB的端口上。
USB DEVICE接收USB总线上的所有数据包,通过数据包的地址域来判断是不是发给自己的数据包:若地址不符,则简单地丢弃该数据包;若地址相符,则通过响应USB HOST的数据包与USB HOST进行数据传输。

从逻辑结构上看,每个USB逻辑设备都直接与USB HOST进行数据传输。与传统接口以硬件手段实现握手的方法不同,USB接口使用“软握手”方法。

USB的软握手机制是透过三个层次的驱动程序实现的,在这中间起到关键作用的是设备驱动程序,该程序在主机与设备之间建立起至少一个管道。管道有两种类型:流管道和消息管道。其中有一个最重要的消息管道是“缺省控制管道”,这个管道在设备一加电的时候就存在了,它提供设备的配置和状态等信息。主机与设备之间的联络就是通过消息管道实现的。

2.4软件层次

这里写图片描述
图7 USB软件结构

USB协议栈驱动程序的主要作用是将设备与相应的设备驱动程序连接起来。因为USB支持的设备很多,而每个具体的设备都有自己对应的设备驱动程序。对于某一具体设备来说,使用哪个驱动来管理,就要由协议栈驱动程序通过读取设备描述符进行挑选。选择好驱动程序之后,协议栈驱动程序还要给USB设备分配地址。

管道建立起来之后,数据的传输控制则由USB接口驱动程序负责完成了。在这里,主机占有绝对主导权。设备发生事件时通过消息管道报告给主机,主机伺机向设备发送命令,开通流管道,发送或接收数据包。主机与设备之间以数据数据包的形式进行传送,显然这与网络上数据传输的方式相同,是一种异步数据传输模式。


3. 手机USB接口与外设通信方案

3.1 USB(手机)<–>USB(外设)

该方案手机与外设均通过USB口进行通讯。
在这里插入图片描述

图8 USB-USB方案结构图
考虑外设主控模块为单片机,因此选用的单片机必须具备驱动USB的能力。之间通讯都是走的标准USB通讯协议。

3.1.1 USB Host简述

USB Host,中文意思是USB主模式,是相对于USB Accessory(USB副模式)来说的。如果Android工作在USB Host模式下,则连接到Android上的USB设备把Android类似的看作是一台主机,例如将鼠标、键盘插入则可以使用键盘、鼠标来操作Android系统。

而USB Accessory模式表示将Android设备类似当作一个USB的键盘、鼠标、U盘插入到电脑主机上一样使用,这两种模式在Android API level-12以上才支持,即Android3.1及更高的版本支持这两种模式。

3.2 USB(手机)<–>UART(外设)

即手机与外设之间利用USB-UART转接器,实现手机与外设的串口通信。
USB-UART转换器是实现USB与RS-232/RS-485/RS-422等串口设备相互通讯的一种协议转换装置(USB协议-串行通信协议)。在通信主机(USB)和RS-232/RS-485/RS-422串口设备之间可以实现数据的双向传输。

在这里插入图片描述

图9 USB-UART方案结构图
该方案只需外设单片机进行串口编程,然后利用安卓USB Host编程。串口编程一般单片机开发都已熟悉,这里主要介绍一下USB Host开发。

需要硬件要求:手机必须支持OTG功能。OTG(On The Go)是一种新型的USB,能够在没有电脑的情行下,实现设备间的数据及图像的传送,在手机中加入传感器,同时将运行程序载入开发板中,通过OTG接口与手机相接,能够让手机拥有更强大的功能。

3.2.1 Android手机通过USB接口进行串口通信

Android手机通过USB接口实现串口通信,主要借助外部USB转串口芯片实现。在这里外设是一个UART串口设备,转换芯片已经转换成USB,帮助安卓上层应用屏蔽了串口。但串口参数还是需要上层应用配置。

其步骤一般包括:发现设备->连接设备->数据双向传输->关闭设备。

其中调用原理是基于安卓软件架构,Android SDK并没有在Framework层实现封装关于串口通信的类库,但是Android是基于Linux kernel 2.6上的,所以我们可以像在Linux系统上一样来使用串口。因为Framework层中并没有封装关于串口通信的类库,所以我们需要通过Android NDK来实现打开、读写串口,然后提供接口供Java本地调用。

4.现有解决方案:

4.1 FTDI方案(免驱动)

这里写图片描述
图10 FTDI整体方案

4.1.1串口设备 <–>FT312X主(Host)<–> 安卓从(Slave)

Host 会向安卓供电,无需外接电源。这个方案是利用了谷歌(Google)开放的一个叫Android Open Accessory Mode 的协议而成的,此方案支持安卓3.1以的手机平板,但如果不是原生谷歌的系统有可能是不支持的,一般出现问题是国内一些山寨品牌。

  1. /com.android.future.usb.accessory.jar
  2. /android.hardware.usb.accessory.xml

如缺少以上其中之一都会导致安卓设备不支持安卓串口。

4.1.2串口设备 <–>FT231X从(Slave)<–> 安卓主(Host)

随着手持式设备的普及,平板电脑、手机和消费电子设备需要搭配可以与USB相连的主端支持变得非常重要。该方案中,FT311D芯片是专为安卓主控端设计,支持Android3.1以上版本,有32脚的QFN或LQFP封装可选。

设备不需要在安卓平台加载任何驱动,但要使用该方案Android手机要支持OTG 功能,并且要具备android.hardware.usb.host.xml

另外,相应的方案需要配合相应软件,
如方案4.1.1需要配合Passion AOA HyperTerminal apk。
方案4.1.2需要配合Android HyperTerminal apk。这两个安卓上的串口调试小助手, 是Passion technologies Limited 开发的免费软件。

4.2 PL2303/CH34X系列方案:

基本原理同FTDI相同,只不过芯片不同。
手机端app是PL2303/Ch34x的生产商公司提供的,有源代码与SDK:
http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=230&pcid=41
这里写图片描述
图11 PL2303整体方案

PL2303 HXD芯片对Android系统要求Android(平板或手机)的OS版本需要在3.2以上。其优点如下:

• 不需要Root权限即可使用
• 不需要重新编译Kernel,免驱动方案
• 利用Android上的USB port供电,或者使用USBHub 以及外设自备电源
##4.3 开源项目:usb-serial-for-android
Github: https://github.com/mik3y/usb-serial-for-android (LGPL licence)
提供了Arduino等其他设备USB串口的安卓端硬件驱动代码,基于Android Host并且Android版本需在3.1版本之上 。 可供参考
##4.4 其他(待补充,但原理都是基于3.1、3.2)

4.3 开源项目:usb-serial-for-android

Github: https://github.com/mik3y/usb-serial-for-android
(LGPL licence)
提供了Arduino等其他设备USB串口的安卓端硬件驱动代码,基于Android Host并且Android版本需在3.1版本之上 。 可供参考


5.针对安卓应用USB-UART芯片比较与选型

  • 1、FT311/312芯片不需要安卓手机和平板支持OTG或USB HOST功能,就能完成USB转RS232的转换功能,兼容性好,必须外接电源,使得在某些应用场景非常不方便。但FT311/312依然是目前已知好用的USB HOST 芯片。

  • 2、FT231,PL2303不需要外接电源,但需要安卓手机和平板支持OTG或USB HOST等限制。由于手机和平板上的安卓系统的多样性,没有确定的标准知道某款手机平板是否支持OTG和USB HOST,且即使手机平板支持OTG功能的情况下,非原生安卓系统仍可能不能完成usb转RS232的功能。所有其兼容性要差一些。

  • 3、在工业应用环境,可考虑使用工业级模块FSTU2232FT。
    因此,针对民用设备,综合考虑,较优越的方案为:使用FT311D和PL2303HXD做转换芯片,优点如下:

• FT311D不需要OTG支持,兼容性好,需要外接电源,价格较贵。
• PL2303HXD需要OTG支持,不需要外接电源,有兼容性问题,价格要便宜些。
• 用PL2303的模块还有一附加好处是同时支持安卓和WINDOWS平台,即可用于手机平板,也同时可用于普通的台式和笔记本电脑。


6.案例分析(待完善验证)

  • 1、USB转串口驱动
    drivers/usb/serial/pl2303.c
    drivers/usb/serial/pl2303.h
    驱动加载成功则当插入外设时会生成/dev/ttyUSB*设备节点,
  • 2、上层App应用,即读写串口,波特率设置等
    源码下载http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=230&pcid=41
    示意图:
    在这里插入图片描述
    在这里插入图片描述

7. 开发需要考虑的几点

  • 1、OTG支持问题:近年新出的绝大部分手机已支持OTG,一般Android系统版本在4.0以上也都会支持,但手机品牌、型号太多,一些低端手机和国产山寨机可能不支持该功能。
  • 2、不同手机厂商可能对USB协议栈进行了裁剪,对开发人员会有限制。
  • 3、USB供电问题、设备兼容性等问题
  • 4、如使用USB-UART方案,要考虑转换芯片的统一、效率等问题,都需验证
  • 5、目前在安卓系统下的串口终端程序,大多是由IC厂家免费提供,功能偏简单,不能发送中文,不能保存通信内容到文件。

博主热门文章推荐:

一篇读懂系列:

LoRa Mesh系列:

网络安全系列:

嵌入式开发系列:

AI / 机器学习系列:


8. 参考资料

[1] 赵春亭, 左小五. 基于Android系统的USB转串口的研究[J]. 工业控制计算机, 2014, 27(1):83-84.
参考链接:
http://blog.csdn.net/ever_gz/article/details/49669729
https://github.com/mik3y/usb-serial-for-android
http://blog.csdn.net/lindonghai/article/details/50717218
http://download.csdn.net/detail/u011130391/6638743
http://gqdy365.iteye.com/blog/2188906
http://blog.csdn.net/tangcheng_ok/article/details/7021470
http://www.jb51.net/article/110827.htm
http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=230&pcid=41

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149880.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • HTML+CSS,让div在屏幕中居中(水平居中+垂直居中)方法总结

    HTML+CSS,让div在屏幕中居中(水平居中+垂直居中)方法总结最近写网页经常需要将div在屏幕中居中显示,遂记录下几个常用的方法,都比较简单。水平居中直接加上&amp;lt;center&amp;gt;标签即可,或者设置margin:auto;当然也可以用下面的方法下面说两种在屏幕正中(水平居中+垂直居中)的方法放上示范的html代码:&amp;lt;body&amp;gt;&amp;lt;divclass=&amp;quot;main&amp;quot;&amp;gt;

  • 计算机中1kb表示的字节数是多少_在计算机中1KB是指几字节

    计算机中1kb表示的字节数是多少_在计算机中1KB是指几字节大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。1kb等于1024个字节。kB(Kilobyte),是一种资讯计量单位,是计算机数据存贮器存储单位字节的多倍形式。现今通常在标识内存等具有一般容量的储存媒介之储存容量时使用。根据国际单位制标准,1kB=1000B(字节,Byte)。根据按照IEC命名标准,用于二进制存储单位的标准命名是KiB,MiB等,1kiB=1024B。这是由…

  • 在 Win10 系统下安装 JDK 及配置环境变量的方法

    在 Win10 系统下安装 JDK 及配置环境变量的方法首先,在官网下载JDK:Oracle官网如上图所示,在Oracle官网下载JDK,但有一点需要注意,那就是在咱们下载合适的JDK之前,需要先点击“标记1”所在的按钮,选择接受。否则的话,直接点击JDK进行下载的时候,会弹出出现界面:选择接受“AcceptLicenseAgreement”之后,再点击JDK进行下载就会弹出下载提示框了,如下图所示:下载完成后,双击可执行文件,

  • C语言socket实现文件下载[通俗易懂]

    C语言socket实现文件下载[通俗易懂]是网络编程的作业,我比较菜。。。写到定位输出,做百分比出现了问题,不显示0到100的,直接从0跳到了100。请教了下大佬。改了过来。原来是类型的问题,做出来的运算应该是float,但是我都定义的int,输出也是,大佬指出后,我好尴尬。。。犯了小错误。。。但是在这次过程也学习了一波。要加油了!!!代码写的这么乱!!!写的是带颜色的版本,,颜色有可能会觉得妖艳,,,好吧。编译平台是vc++6.0

  • 对不起,学会这些 Linux 知识后,我有点飘

    对不起,学会这些 Linux 知识后,我有点飘Linux简介UNIX是一个交互式系统,用于同时处理多进程和多用户同时在线。为什么要说UNIX,那是因为Linux是由UNIX发展而来的,UNIX是由程序员设计,它的主要服务对象也是程序员。Linux继承了UNIX的设计目标。从智能手机到汽车,超级计算机和家用电器,从家用台式机到企业服务器,Linux操作系统无处不在。大多数程序员都喜欢让系统尽量简单,优雅并具有一致性。举个例子,从最底层的角度来讲,一个文件应该只是一个字节集合。为了实现顺序存取、随机存取、按键存取、远程存取只能是

  • java json对象和json字符串互转的方法_js中对象转字符串的方法

    java json对象和json字符串互转的方法_js中对象转字符串的方法一、准备工作定义三个json字符串用于以下测试://json字符串-简单对象StringjsonStr=”{\”studentName\”:\”张三\”,\”studentAge\”:18}”;//json字符串-数组类型StringjsonArrStr=”[{\”studentName\”:\”张三\”,\”studentAge\”:18},{\”studentName\”:\”李四\”,\”studentAge\”:17}]”;//json字符串-复杂对象Strin.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号