Android串口通信,由 Google 官方串口通信库迁移而来,并扩展支持设置 su 路径、串口路径、波特率、校验位、数据位、停止位
Branch: master
Clone or download
Latest commit 00e2c7e Jul 13, 2018
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
app fix doc Jun 2, 2018
gradle/wrapper Initial commit May 17, 2018
serialportlib 1.v1.2.0 Jun 2, 2018
.gitignore 1.add apk Jun 2, 2018
README.md 1.update readme.md Jul 13, 2018
app-release.apk 1.add apk Jun 2, 2018
build.gradle 1.接收、发送 May 30, 2018
config.gradle 1.接收、发送 May 30, 2018
gradle.properties Initial commit May 17, 2018
gradlew Initial commit May 17, 2018
gradlew.bat Initial commit May 17, 2018
settings.gradle Initial commit May 17, 2018

README.md

AndroidSerialPort

说明

AndroidSerialPort 用于串口通信,由 Google 官方串口通信库迁移而来,并在此基础上做了扩展。

AndroidSerialPort 支持设置 su 路径、串口路径、波特率、校验位、数据位、停止位。

更多相关信息,请查看 Android 串口通信


Demo

通过这个串口库,做了一个串口调试工具。 SerialPort

下载apk

使用

  1. 在 modul 下的 build.gradle 中添加

    implementation "com.deemons.serialport:serialport:1.2.0"	//替换版本号
  2. 打开串口

    SerialPort mSerialPort = new SerialPort("/dev/ttyS1", 9600);
    //获取串口文件的输入输出流,以便数据的收发
    InputStream is = mSerialPort.getInputStream();
    OutputStream os = mSerialPort.getOutputStream();

API

设置 su 路径

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

因此需要 root 权限来操作串口文件,默认的 su 文件路径在 /system/bin/su ,你可以重新设置 su 的文件路径,以便获取 root 权限,例如,设置路径/system/xbin/su

//需要在打开串口前调用
SerialPort.setSuPath("/system/xbin/su");

查看串口设备列表

Android 串口文件都在 /proc/tty/drivers 目录下,因此可以获取所有串口文件。

SerialPortFinder serialPortFinder = new SerialPortFinder();
String[] allDevices = serialPortFinder.getAllDevices();
String[] allDevicesPath = serialPortFinder.getAllDevicesPath();

打开串口

如果你需要设置更多参数,请使用以下构造函数

/**
 * 打开串口
 * @param device 串口设备文件
 * @param baudRate 波特率
 * @param parity 奇偶校验,0 None(默认); 1 Odd; 2 Even
 * @param dataBits 数据位,5 ~ 8  (默认8)
 * @param stopBit 停止位,1 或 2  (默认 1)
 * @param flags 标记 0(默认)
 */
public SerialPort(File device, int baudRate, int parity, int dataBits, int stopBit, int flags)

检验位一般默认是0(NONE),数据位一般默认为8,停止位默认为1。


读写串口

读数据
// 配合 Rxjava2 ,处理异常更方便
mReceiveDisposable = Flowable.create((FlowableOnSubscribe<byte[]>) emitter -> {
    InputStream is = mSerialPort.getInputStream();
    int available;
    int first;
    while (!isInterrupted && mSerialPort != null 
           && is != null && (first = is.read()) != -1) {
        do {
            available = is.available();
            SystemClock.sleep(1);
        } while (available != is.available());

        byte[] bytes = new byte[is.available()+1];
        is.read(bytes,1,is.available());
        bytes[0] = (byte) (first & 0xFF);
        emitter.onNext(bytes);
    }
    close();
}, BackpressureStrategy.MISSING)
写数据
//获取输出流
OutputStream os = mSerialPort.getOutputStream();
os.write(ByteUtils.hexStringToBytes("CCAA0300"));

关闭串口

 mSerialPort.close();