在 Android 上进行串口通信,通常使用 **android-serialport-api**(基于 JNI 访问 Linux TTY 设备)。对于多串口场景,核心思路是**为每个串口独立维护一个 `SerialPort` 实例**,并分别管理各自的输入/输出流及读取线程。
下面给出完整的多串口开发方案,包括依赖配置、权限处理、打开多个串口、同时读写,以及注意事项。
一、准备工作
1. 添加依赖
使用社区维护的 `Android-SerialPort-API`(支持多串口、参数配置、已编译好 .so):
```groovy
dependencies {
implementation 'com.github.licheedev:Android-SerialPort-API:2.0.0'
}
```
或在 `libs` 中放置 `serialport.jar` 并自行编译 `libserial_port.so`(原 google 方案)。
2. 权限与设备节点
- 应用需要 **读写串口设备节点** 的权限(如 `/dev/ttyS0`, `/dev/ttyUSB0` 等)。
- 通常需要 **root** 设备,或修改 `ueventd.rc` 赋予 `0666` 权限,或使用 `su` 动态授权。
- 在 `AndroidManifest.xml` 中声明权限(即使 root 也需要):
```xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
```
但对于串口节点,普通权限不够,实际需要通过 `Runtime.exec("su")` 更改节点权限或直接以 root 运行应用。
3. 检查串口设备
列出 `/dev` 下的串口节点:
```bash
ls /dev/tty* /dev/ttyS* /dev/ttyUSB*
```
通常在开发板或工业平板中串口为 `ttyS0`, `ttyS1`;USB 转串口为 `ttyUSB0` 等。
二、核心代码实现
1. 串口参数配置类
```kotlin
data class SerialParam(
val path: String, // 如 "/dev/ttyS0"
val baudRate: Int, // 9600, 115200...
val dataBits: Int = 8, // 5~8
val stopBits: Int = 1, // 1 or 2
val parity: Int = 0 // 0:NONE, 1:ODD, 2:EVEN
)
```
2. 打开串口并获取输入/输出流
```kotlin
import android_serialport_api.SerialPort
class SerialManager(private val param: SerialParam) {
private var serialPort: SerialPort? = null
private var inputStream: FileInputStream? = null
private var outputStream: FileOutputStream? = null
private var readingThread: