# And485Module
**Repository Path**: ukiot/and485-module
## Basic Information
- **Project Name**: And485Module
- **Description**: 这是一个适用于Android平台的RS485串口通信库,支持GPIO收发使能控制。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-10-01
- **Last Updated**: 2025-10-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# UKSerial - RS485串口通信库
这是一个适用于Android平台的RS485串口通信库,支持GPIO收发使能控制。
## 功能特性
- ✅ 完整的RS485串口通信功能
- ✅ GPIO收发使能自动控制
- ✅ 支持多种波特率(300 - 921600)
- ✅ 支持数据位、停止位、校验位配置
- ✅ 阻塞和非阻塞读取模式
- ✅ 自动切换发送/接收模式
- ✅ 线程安全的实现
- ✅ 完整的错误处理
## 快速开始
### 1. 添加依赖
在你的 `settings.gradle` 中添加:
```gradle
include ':ukserial'
```
在你的应用模块的 `build.gradle` 中添加依赖:
```gradle
dependencies {
implementation project(':ukserial')
}
```
### 2. 基本使用
```java
import com.ukiot.ukserial.RS485;
import com.ukiot.ukserial.SerialConfig;
// 创建RS485实例
// 参数1:串口设备路径
// 参数2:GPIO收发使能管脚路径
RS485 rs485 = new RS485("/dev/ttyS1", "/sys/class/gpio/gpio100");
// 打开串口(使用默认配置:8N1)
boolean success = rs485.open(SerialConfig.BAUD_RATE_9600);
if (success) {
// 发送数据
byte[] data = "Hello RS485".getBytes();
int written = rs485.write(data);
// 读取数据(非阻塞)
byte[] buffer = new byte[256];
int bytesRead = rs485.read(buffer);
// 读取数据(带超时,1000毫秒)
bytesRead = rs485.read(buffer, buffer.length, 1000);
// 关闭串口
rs485.close();
}
// 释放资源
rs485.release();
```
### 3. 高级配置
```java
// 创建RS485实例
RS485 rs485 = new RS485("/dev/ttyS1", "/sys/class/gpio/gpio100");
// 打开串口,自定义配置
// 参数:波特率、数据位、停止位、校验位
boolean success = rs485.open(
SerialConfig.BAUD_RATE_115200, // 115200波特率
SerialConfig.DATA_BITS_8, // 8数据位
SerialConfig.STOP_BITS_1, // 1停止位
SerialConfig.PARITY_EVEN // 偶校验
);
if (success) {
// 发送指定长度的数据
byte[] data = new byte[]{0x01, 0x03, 0x00, 0x00, 0x00, 0x0A};
int written = rs485.write(data, data.length);
// 清空输入缓冲区
rs485.flushInput();
// 清空输出缓冲区
rs485.flushOutput();
// 清空所有缓冲区
rs485.flushAll();
}
```
## API说明
### RS485类
#### 构造函数
```java
public RS485(String devicePath, String rtsGpioPath)
```
- `devicePath`: 串口设备路径,例如 `"/dev/ttyS1"`
- `rtsGpioPath`: GPIO收发使能管脚路径,例如 `"/sys/class/gpio/gpio100"`
#### 打开串口
```java
public boolean open(int baudRate)
public boolean open(int baudRate, int dataBits, int stopBits, int parity)
```
- `baudRate`: 波特率,使用 `SerialConfig.BAUD_RATE_*` 常量
- `dataBits`: 数据位(5-8)
- `stopBits`: 停止位(1或2)
- `parity`: 校验位(0=无,1=奇,2=偶)
- 返回值: `true`成功,`false`失败
#### 关闭串口
```java
public void close()
```
#### 发送数据
```java
public int write(byte[] data)
public int write(byte[] data, int length)
```
- 返回值: 实际发送的字节数,-1表示失败
#### 读取数据
```java
public int read(byte[] buffer)
public int read(byte[] buffer, int maxLength)
public int read(byte[] buffer, int maxLength, int timeoutMs)
```
- `buffer`: 接收缓冲区
- `maxLength`: 最大读取长度
- `timeoutMs`: 超时时间(毫秒),0表示非阻塞
- 返回值: 实际读取的字节数,-1表示失败,0表示超时或无数据
#### 清空缓冲区
```java
public void flushInput() // 清空输入缓冲区
public void flushOutput() // 清空输出缓冲区
public void flushAll() // 清空所有缓冲区
```
#### 其他方法
```java
public boolean isOpened() // 检查串口是否已打开
public String getDevicePath() // 获取设备路径
public int getBaudRate() // 获取波特率
public void release() // 释放所有资源
```
### SerialConfig类
提供常用的串口配置常量:
#### 波特率常量
- `BAUD_RATE_300`
- `BAUD_RATE_600`
- `BAUD_RATE_1200`
- `BAUD_RATE_2400`
- `BAUD_RATE_4800`
- `BAUD_RATE_9600`
- `BAUD_RATE_19200`
- `BAUD_RATE_38400`
- `BAUD_RATE_57600`
- `BAUD_RATE_115200`
- `BAUD_RATE_230400`
- `BAUD_RATE_460800`
- `BAUD_RATE_921600`
#### 数据位常量
- `DATA_BITS_5`
- `DATA_BITS_6`
- `DATA_BITS_7`
- `DATA_BITS_8`
#### 停止位常量
- `STOP_BITS_1`
- `STOP_BITS_2`
#### 校验位常量
- `PARITY_NONE` (无校验)
- `PARITY_ODD` (奇校验)
- `PARITY_EVEN` (偶校验)
## 权限要求
在 `AndroidManifest.xml` 中添加必要的权限:
```xml
```
确保您的应用有访问串口设备和GPIO的权限(通常需要root权限或系统签名)。
## GPIO配置
在使用RS485之前,需要先导出GPIO管脚。可以在shell中执行:
```bash
# 导出GPIO(假设使用GPIO100)
echo 100 > /sys/class/gpio/export
# 设置为输出模式(库会自动设置,也可以手动设置)
echo out > /sys/class/gpio/gpio100/direction
# 设置初始值为0(接收模式)
echo 0 > /sys/class/gpio/gpio100/value
```
或者在代码中使用Runtime执行:
```java
try {
Runtime.getRuntime().exec("su -c 'echo 100 > /sys/class/gpio/export'");
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
```
## 工作原理
### RS485收发控制
RS485是半双工通信协议,同一时刻只能发送或接收数据。本库通过GPIO管脚自动控制收发使能:
1. **发送数据时**:
- 将GPIO设置为高电平(1)→ 进入发送模式
- 发送数据
- 等待数据发送完成
- 将GPIO设置为低电平(0)→ 返回接收模式
2. **接收数据时**:
- GPIO保持低电平(0)→ 接收模式
- 读取数据
### 线程安全
在多线程环境中使用时,建议:
- 每个RS485实例只在一个线程中操作
- 或者使用外部同步机制(如synchronized)保护读写操作
## 示例项目
完整的使用示例请参考 `app` 模块中的 `MainActivity.java`。
## 故障排除
### 串口打开失败
1. 检查设备路径是否正确
2. 确保有访问串口设备的权限
3. 检查串口设备是否被其他程序占用
### GPIO控制失败
1. 检查GPIO是否已正确导出
2. 确保GPIO路径正确
3. 检查是否有访问GPIO的权限
### 数据收发异常
1. 检查波特率等参数是否与对端设备匹配
2. 检查硬件连线是否正确
3. 使用示波器或逻辑分析仪检查信号
## 技术支持
如有问题或建议,请联系技术支持。
## 版本历史
### v1.0.0
- 初始版本
- 完整的RS485通信功能
- GPIO收发使能控制
- 支持多种波特率和串口配置
## 许可证
版权所有 © UKIOT