Android 串口通信

annie-spratt-648653-unsplash_meitu_1

前段时间,接触了一个智能硬件的项目,在定制化的平板上运行 Android 系统,并通过串口和蓝牙与其他设备进行通讯。
担心时间长了,就容易忘记,因此,整理了关于 Android 串口通信的知识。

什么是串口通信

先来一段 百度百科的解释

串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。

串口通信(Serial Communications)是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。

串口通信是计算机中非常常见的通信方式,比如一些有线鼠标、键盘、打印机等都是通过串口进行通信的。

串口的通信一般使用3根线完成,分别是地线、发送线(tx)、接收线(rx)。


串口的参数

串口中有五个重要的参数:串口设备名、波特率、奇偶校验位、数据位、停止位。

  • 设备名称:串口的名称。
  • 波特率:传输速率的参数,波特率和传输距离成反比。
  • 校验位:在串口通信中一种简单的检错方式,有四种检错方式:偶、奇、高和低,允许无校验位。
  • 数据位:通信中实际数据位的参数
  • 停止位:用于表示单个包的最后一位。

其中检验位一般默认位NONE,数据位一般默认为8,停止位默认为1,校验位是为了减少误差的会根据奇、偶进行补位操作。

对于两个进行通信的端口,这些参数必须匹配,否则两端不能正常收发。


Android 串口通信

Android 主板在与其它硬件进行串口通信时,串口作为底层实现,Android 系统把设备作为一个文件,与其他设备进行串口通信就相当于读写此文件。

所以,串口通信其实就是对系统根目录下 /proc/tty/drivers 文件进行流的读写,因此,串口读写需要 Android 系统 Root 权限,不必担心,一般开发版的系统都会 Root 。


在应用层进行串口通信之前,千万要检测开发板的串口是否调通,不要背锅哦~(不要问我为什么知道这坑)

检测的方式可以选择 adb 或者直接下载 Android 调试工具,进行调试,推荐使用工具,简单方便。

那么先说说 adb 方式的检测。

检测

检测的原理就是,将 开发板串口线 连接上 电脑 (PC),然后在 PC 和开发板 上,相互进行串口数据的读写。如果两边都能顺利收发数据,那么说明开发板的串口是畅通的。

准备

Windows:友善串口调试工具

Mac OS 上的串口调试工具不清楚

连接

  1. 串口线 连接开发板 和 PC,然后在串口调试工具中,打开对应位置的端口。如果提示失败,就要检查串口线的端口号是否正确。

  2. 用数据线连接开发板至 PC,用 adb 命令打开 Android 系统对应的串口文件。

    以 root 权限进入系统,

    1
    2
    adb shell
    su

    然后,更改串口文件ttyS3的读写权限,

    1
    chmod 777 /dev/ttyS3

    最后,写入信息 1111 到串口文件ttyS3

    1
    echo 1111 > /dev/ttyS3

    观察 PC 上的串口调试工具,如果 PC 上能收到信息,说明调通了,那么就可以进行应用开发了。


官方串口工具

Android 应用层如果操作串口,需要用到 JNI ,谷歌官方早已经开源了相关工具库:android-serialport-api

官方地址需要翻墙,也可以直接搜索这个工具,下载体验 Dmo。

谷歌官方的这个库太过陈旧,使用也麻烦,而且谷歌官方串口库的设置,仅支持串口名称及波特率,有时候并不能够满足需求。

基于以上原因,因此利用Android studio 3.1上 CMake,将官方串口库移植过来 ,并对其进行适当扩展,现支持如下配置:

  • su 路径
  • 串口路径
  • 波特率
  • 校验位
  • 数据位
  • 停止位。

为了方便使用,此库已经发布到 JCenter 上,以后可以非常容易的集成它。

同时,使用这个库做了一个Android 串口调试工具,方便调试。

SerialPort

apk 下载
源码地址:AndroidSerialPort


参考

Android串口通信(Android Studio)

Android串口通信:抱歉,学会它真的可以为所欲为

让android_serialport_api支持奇偶校验、数据位、停止位等参数


坚持分享技术,但行好事,莫问前程 ~^o^~