# 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. 错误恢复
   - 异常重试机制
   - 通信状态监控
   - 错误日志记录
