赞
踩
更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,共同探讨软件知识经验,关注就有海量学习资料免费领哦:
针对手机与外部设备通信,仅有USB与音频接口可以使用,而由于iOS手机不支持OTG功能。因此,本文主要对Android手机通过USB接口与外设通信进行介绍。音频接口部分可参考文档http://blog.csdn.net/howiexue/article/details/79145048 。
– 随着移动互联网技术的迅猛发展,两大主流智能移动设备iOS 和Android占据了绝对的市场,除了基本的通话、娱乐功能之外,这些移动设备已经成为新时代中重要的信息终端设备节点。
– 通用串行总线(USB)目前已经成为了最标准的接口,用于提供系统一个可靠且低成本的数字连接,目前在使用方面已经超越了电脑的范畴,并已广泛应用在工业、医疗、消费电子、通信网络等等。
– RS232接口长期广泛存在于在各种应用领域,随着安卓手机平板的大量上市,安卓系统下通过USB转RS232接口接入外设的应用需求也开始变得强烈起来。
市面上现有的手机USB接口与外设通信实例:
图1 手机U盘
图2 手机USB摄像头
即插即用,可热插拔,具有自动配置能力,用户只要简单地将外设插人到手机就能自动识别和配置uSB设备。
目前安卓手机、平板都具备USB接口,连 接灵活,易扩展。
USB2.0总线提供最大达5v电压、500mA电流,USB3.0 可达1A。大部分USB外设无需单独的供电系统。
由于 USB 的诸多特点,在PC的外围设备中,取代了大部分传统的接口。但在智能仪器仪表中,还大量地使用RS一232C接口。随着智能仪器仪表控制系统的日益复杂,数据采集量的增大,迫切需要寻求一种更高速、安全、方便的通信形式。USB接口的特点,恰好满足这种应用要求,USB产品进人智能仪器仪表和工业控制领域将是必然的。
USB通讯协议十分复杂,这里不赘述,只简要介绍基本知识。
图3 常用USB接口图
如上图,包括常见的Standard Type-A、Type-B、Micro等接口
其中Micro USB接口是USB 2.0标准的一个便携版本,支持OTG,目前除苹果公司产品之外,先进市面上几乎所有的移动设备都采用了Micro-USB接口。
图4 Micro USB接口图
图5 各USB 版本传输速率与输出电流对比
图5 USB通信过程
一般的USB主机和设备之间遵循主从通信的原理,每一次的数据传输都是又主机发起。如果主机要输出数据,则先发一个握手包,通知设备。然后发送数据,设备接收到数据后,再发送一个确认包。如果主机要输入数据,也是先发一个握手包,通知设备。设备然后将准备好的数据发送给主机。主机再给设备一个确认包。
从物理结构上,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的软握手机制是透过三个层次的驱动程序实现的,在这中间起到关键作用的是设备驱动程序,该程序在主机与设备之间建立起至少一个管道。管道有两种类型:流管道和消息管道。其中有一个最重要的消息管道是“缺省控制管道”,这个管道在设备一加电的时候就存在了,它提供设备的配置和状态等信息。主机与设备之间的联络就是通过消息管道实现的。
图7 USB软件结构
USB协议栈驱动程序的主要作用是将设备与相应的设备驱动程序连接起来。因为USB支持的设备很多,而每个具体的设备都有自己对应的设备驱动程序。对于某一具体设备来说,使用哪个驱动来管理,就要由协议栈驱动程序通过读取设备描述符进行挑选。选择好驱动程序之后,协议栈驱动程序还要给USB设备分配地址。
管道建立起来之后,数据的传输控制则由USB接口驱动程序负责完成了。在这里,主机占有绝对主导权。设备发生事件时通过消息管道报告给主机,主机伺机向设备发送命令,开通流管道,发送或接收数据包。主机与设备之间以数据数据包的形式进行传送,显然这与网络上数据传输的方式相同,是一种异步数据传输模式。
该方案手机与外设均通过USB口进行通讯。
图8 USB-USB方案结构图
考虑外设主控模块为单片机,因此选用的单片机必须具备驱动USB的能力。之间通讯都是走的标准USB通讯协议。
USB Host,中文意思是USB主模式,是相对于USB Accessory(USB副模式)来说的。如果Android工作在USB Host模式下,则连接到Android上的USB设备把Android类似的看作是一台主机,例如将鼠标、键盘插入则可以使用键盘、鼠标来操作Android系统。
而USB Accessory模式表示将Android设备类似当作一个USB的键盘、鼠标、U盘插入到电脑主机上一样使用,这两种模式在Android API level-12以上才支持,即Android3.1及更高的版本支持这两种模式。
即手机与外设之间利用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接口与手机相接,能够让手机拥有更强大的功能。
Android手机通过USB接口实现串口通信,主要借助外部USB转串口芯片实现。在这里外设是一个UART串口设备,转换芯片已经转换成USB,帮助安卓上层应用屏蔽了串口。但串口参数还是需要上层应用配置。
其步骤一般包括:发现设备->连接设备->数据双向传输->关闭设备。
其中调用原理是基于安卓软件架构,Android SDK并没有在Framework层实现封装关于串口通信的类库,但是Android是基于Linux kernel 2.6上的,所以我们可以像在Linux系统上一样来使用串口。因为Framework层中并没有封装关于串口通信的类库,所以我们需要通过Android NDK来实现打开、读写串口,然后提供接口供Java本地调用。
图10 FTDI整体方案
Host 会向安卓供电,无需外接电源。这个方案是利用了谷歌(Google)开放的一个叫Android Open Accessory Mode 的协议而成的,此方案支持安卓3.1以的手机平板,但如果不是原生谷歌的系统有可能是不支持的,一般出现问题是国内一些山寨品牌。
- /com.android.future.usb.accessory.jar
- /android.hardware.usb.accessory.xml
如缺少以上其中之一都会导致安卓设备不支持安卓串口。
随着手持式设备的普及,平板电脑、手机和消费电子设备需要搭配可以与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 开发的免费软件。
基本原理同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)
Github: https://github.com/mik3y/usb-serial-for-android
(LGPL licence)
提供了Arduino等其他设备USB串口的安卓端硬件驱动代码,基于Android Host并且Android版本需在3.1版本之上 。 可供参考
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平台,即可用于手机平板,也同时可用于普通的台式和笔记本电脑。
一篇读懂系列:
LoRa Mesh系列:
网络安全系列:
嵌入式开发系列:
AI / 机器学习系列:
[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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。