# 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