AndroidSerialPort

Introduction: Android 串口通信,由 Google 官方串口通信库迁移而来,并扩展支持设置 su 路径、串口路径、波特率、校验位、数据位、停止位
More: Author   ReportBugs   
Tags:

说明

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();
Apps
About Me
Google+: Trinea trinea
GitHub: Trinea