• Stars
    star
    225
  • Rank 177,187 (Top 4 %)
  • Language
    Java
  • Created over 6 years ago
  • Updated over 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

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

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();