CH340/CH341安卓应用开发指南


安卓设备通过USB口连接CH340扩展串口的应用方案,安卓设备需要工作在:USB Host(主机模式)

说明:当 Android 设备处于 USB 主机模式时,它充当 USB 主机,为总线供电,并枚举连接的 USB 设备。Android 3.1 及更高版本支持 USB 主机模式。

安卓系统访问USB转串口通常有以下两种实现方式:

1. 基于安卓官方提供usb库android.hardware.usb开发,使用USB Host APIs完成安卓主机与USB设备的通讯;

2. 安卓系统底层移植Linux USB转串口设备驱动,安卓应用层直接访问系统/dev目录下ttyUSB设备节点;

本篇博客,仅介绍第一种实现方式。WCH官方已经基于安卓官方的usb包提供了封装好的应用库及整个开发工程。如果用户需要了解更多的实现细节,建议阅读官方资料:https://developer.android.com/guide/topics/connectivity/usb/host.html

1. 下载官方安卓开发资料包:CH341SER_ANDROID.ZIP

2. 资料包中包含几个部分:目标APK文件,工程文件,安卓库文件,安卓开发说明文档。

一、安卓APP应用CH34xUARTDemo.apk使用指南

正常情况下,安装完APP以后,当安卓设备检测到CH340硬件接入后,会自动弹出该APP启动对话框,申请USB访问权限。点击确认后即可与CH340进行正常的串口通讯。软件主界面提供了:串口开关,设置,读写等基本功能。若硬件连接后软件无法自动启动,或者手动点击"Open"打开失败,需要检查以下两点问题:

1. 安卓设备是否工作在主机模式下(可测量USB口电压确认),手机一般需要接入USB转OTG数据线切换到Host模式;

2. 系统是否包含android.hardware.usb包对应的库文件,也称驱动文件(libusbhost.ko)。

可以参考如下博客内容来检测相关权限:Android 系统使用USB OTG功能/打开USB Host API功能

当“Open”成功后,选择串口配置,然后点击右上角“Config”确认。如下所示:

二、CH340安卓库文件使用指南

为了方便客户将开发库集成到软件产品上,提供了2个版本的库文件。其中带有“no_toast”标识的库文件默认去除了“Toast”提示信息。API使用可直接阅读压缩包中开发文档《CH34xUart_Android_Dvlp_Guide》,下面对主要接口做说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
EnumerateDevice:枚举 CH34x 设备
函数原型 :public UsbDevice EnumerateDevice()
返回枚举到的 CH34x 的设备,若无设备则返回 null

OpenDevice:打开 CH34x 设备
函数原型 :public void OpenDevice(UsbDevice mDevice)
mDevice :需要打开的 CH34x 设备

ResumeUsbList:枚举并打开 CH34x 设备,这个函数包含了 EnumerateDevice,OpenDevice 操作
函数原型 :public int ResumeUsbList()
返回 0 则成功,否则失败

UartInit:设置初始化 CH34x 芯片
函数原型 :public boolean UartInit()
若初始化失败,则返回 false,成功返回 true

SetConfig:设置 UART 接口的波特率、数据位、停止位、奇偶校验位以及流控
函数原型 :public boolean SetConfig(int baudRate, byte dataBit, byte stopBit, byte
parity, byte flowControl)
baudRate :波特率:300,600,1200、2400、4800、9600、19200、38400、57600、115200、
230400、460800、921600,默认:9600
dataBits :5 个数据位、6 个数据位、7 个数据位、8 个数据位,默认:8 个数据位
stopBits :0:1 个停止位,1:2 个停止位,默认:1 个停止位
parity :0:none,1:add,2:even,3:mark 和 4:space,默认:none
flowControl :0:none,1:cts/rts,默认:none
若设置失败,则返回 false,成功返回 true

WriteData:发送数据
函数原型 :public int WriteData(byte[] buf, int length)
buf :发送缓冲区
length :发送的字节数
返回值为写成功的字节数

ReadData:读取数据
函数原型 :public int ReadData(char[] data, int length)
data :接收缓冲区,数据类型为 char
length :读取的字节数
返回实际读取的字节数

CloseDevice:关闭串口。
函数原型 :public void CloseDevice()

isConnected:判断设备是否已经连接到 Android 系统
函数原型 :public boolean isConnected()
返回为 false 时表示设备未连接到系统,true 表示设备已连接

SetTimeOut:设置读写超时时间
函数原型:public boolean SetTimeOut(int WriteTimeOut, int ReadTimeOut)
WriteTimeOut:设置写超时时间,默认为 10000ms
ReadTimeOut :设置读超时时间,默认为 10000ms

关于安卓设备操作多个CH340/CH341的应用需求以及其他功能定制需求,可以留言或邮件交流。