# serial.py 函数文档 Modbus RTU串口通信实现模块,提供完整的Modbus串口通信功能。 ## Serial 类 ### 初始化
python
def __init__(self, uart_id, baudrate=9600, data_bits=8, stop_bits=1, parity=None, pins=None, ctrl_pin=None)

- 功能: 初始化串口通信
- 参数:
- uart_id: UART端口号
- baudrate: 波特率(默认9600)
- data_bits: 数据位(默认8)
- stop_bits: 停止位(默认1)
- parity: 校验位(默认None)
- pins: 引脚配置
- ctrl_pin: RS485方向控制引脚
- 特性: 自动计算字符时间 ### 核心功能 #### 读取功能 ##### read_coils
python
def read_coils(self, slave_addr, starting_addr, coil_qty)

- 功能: 读取线圈状态
- 参数:
- slave_addr: 从机地址
- starting_addr: 起始地址
- coil_qty: 线圈数量
- 返回值: 布尔值列表 ##### read_discrete_inputs
python
def read_discrete_inputs(self, slave_addr, starting_addr, input_qty)

- 功能: 读取离散输入
- 参数:
- slave_addr: 从机地址
- starting_addr: 起始地址
- input_qty: 输入数量
- 返回值: 布尔值列表 ##### read_holding_registers
python
def read_holding_registers(self, slave_addr, starting_addr, register_qty, signed=True)

- 功能: 读取保持寄存器
- 参数:
- slave_addr: 从机地址
- starting_addr: 起始地址
- register_qty: 寄存器数量
- signed: 是否有符号
- 返回值: 整数值列表 ##### read_input_registers
python
def read_input_registers(self, slave_addr, starting_address, register_quantity, signed=True)

- 功能: 读取输入寄存器
- 参数:
- slave_addr: 从机地址
- starting_address: 起始地址
- register_quantity: 寄存器数量
- signed: 是否有符号
- 返回值: 整数值列表 #### 写入功能 ##### write_single_coil
python
def write_single_coil(self, slave_addr, output_address, output_value)

- 功能: 写入单个线圈
- 参数:
- slave_addr: 从机地址
- output_address: 输出地址
- output_value: 输出值
- 返回值: 操作状态 ##### write_single_register
python
def write_single_register(self, slave_addr, register_address, register_value, signed=True)

- 功能: 写入单个寄存器
- 参数:
- slave_addr: 从机地址
- register_address: 寄存器地址
- register_value: 寄存器值
- signed: 是否有符号
- 返回值: 操作状态 ##### write_multiple_coils
python
def write_multiple_coils(self, slave_addr, starting_address, output_values)

- 功能: 写入多个线圈
- 参数:
- slave_addr: 从机地址
- starting_address: 起始地址
- output_values: 输出值列表
- 返回值: 操作状态 ##### write_multiple_registers
python
def write_multiple_registers(self, slave_addr, starting_address, register_values, signed=True)

- 功能: 写入多个寄存器
- 参数:
- slave_addr: 从机地址
- starting_address: 起始地址
- register_values: 寄存器值列表
- signed: 是否有符号
- 返回值: 操作状态 ### 内部方法 #### 数据处理
python
def _calculate_crc16(self, data)
def _bytes_to_bool(self, byte_list)
def _to_short(self, byte_array, signed=True)

- CRC16校验计算
- 字节转布尔值列表
- 字节数组转短整型 #### 通信控制
python
def _send_receive(self, modbus_pdu, slave_addr, count)
def _uart_read(self)
def _validate_resp_hdr(self, response, slave_addr, function_code, count)

- 发送接收数据
- UART读取
- 响应头验证 ## 使用示例 ### 基本读取操作
python
# 创建串口实例
serial = Serial(uart_id=2, baudrate=9600) # 读取线圈
coil_status = serial.read_coils(slave_addr=1, starting_addr=0, coil_qty=8) # 读取寄存器
registers = serial.read_holding_registers(slave_addr=1, starting_addr=0, register_qty=4)
### 基本写入操作
python
# 写单个线圈
status = serial.write_single_coil(slave_addr=1, output_address=0, output_value=True) # 写多个寄存器
values = [100, 200, 300]
status = serial.write_multiple_registers(slave_addr=1, starting_address=0, register_values=values)
### RS485控制
python
# 使用方向控制引脚
serial = Serial(uart_id=2, baudrate=9600, ctrl_pin=15)
## 技术规格 ### 通信参数
- 波特率: 1200-115200
- 数据位: 5-8
- 停止位: 1-2
- 校验位: None/Even/Odd ### 超时设置
- 字符时间: 根据波特率自动计算
- 响应超时: 40次轮询(约2秒) ### 缓冲区大小
- 接收缓冲区: 动态
- 发送缓冲区: 根据协议自动调整 ## 错误处理 ### 通信错误
- CRC校验错误
- 响应超时
- 从机异常 ### 数据错误
- 地址错误
- 数值范围错误
- 响应格式错误 ## 注意事项 1. 通信稳定性
- 合适的波特率选择
- 正确的线路连接
- RS485方向控制时序 2. 数据处理
- 有符号数处理
- 字节序考虑
- CRC校验必要性 3. 性能优化
- 批量读写操作
- 超时时间设置
- 缓冲区管理 4. 错误恢复
- 异常重试机制
- 通信状态监控
- 错误日志记录