# 串口发送监控功能说明

## 概述
在系统监控模块中增加了串口（UART/RS485）发送数据的统计功能，用于跟踪通过串口发出的数据量和错误情况。

## 新增功能

### 1. 监控统计字段
在 `SystemMonitorStats_t` 结构体中新增了三个字段：

```c
// 串口发送监控信息
uint32_t uart_tx_count;          // 串口发送次数
uint32_t uart_tx_bytes;          // 串口发送总字节数
uint32_t uart_tx_error_count;    // 串口发送错误次数
```

### 2. 监控函数

#### SystemMonitor_ReportUARTTx()
```c
void SystemMonitor_ReportUARTTx(uint32_t bytes_sent);
```
- **功能**: 报告成功的串口发送操作
- **参数**: `bytes_sent` - 本次发送的字节数
- **调用时机**: 在 `RS485_SendData()` 中DMA启动成功后调用

#### SystemMonitor_ReportUARTTxError()
```c
void SystemMonitor_ReportUARTTxError(void);
```
- **功能**: 报告串口发送错误
- **调用时机**: 在 `RS485_SendData()` 中DMA启动失败时调用

### 3. 集成位置

#### rs485_driver.c
在 `RS485_SendData()` 函数中集成了监控调用：
- DMA启动成功时，调用 `SystemMonitor_ReportUARTTx(Size)` 记录发送字节数
- DMA启动失败时，调用 `SystemMonitor_ReportUARTTxError()` 记录错误

### 4. 监控数据保存

监控数据会定期保存到SD卡的 `LOG.TXT` 文件中，采用精简格式以减少阻塞时间：

```
Samples:[样本数] Ovf:[溢出数]
SD:Wr=[写入次数] Err=[错误数] Full=[满次数] Bytes=[字节数] Files=[文件数] Drop=[丢弃数]
UART:Tx=[发送次数] Bytes=[字节数] Err=[错误数]
```

**示例输出**：
```
Samples:1000000 Ovf:5
SD:Wr=500 Err=2 Full=3 Bytes=32000000 Files=10 Drop=15
UART:Tx=250 Bytes=12500 Err=1
```

## 使用示例

### 获取串口统计信息
```c
SystemMonitorStats_t stats;
SystemMonitor_GetStats(&stats);

// 访问串口统计数据
uint32_t tx_count = stats.uart_tx_count;
uint32_t tx_bytes = stats.uart_tx_bytes;
uint32_t tx_errors = stats.uart_tx_error_count;
```

### 计算发送速率
```c
// 假设运行时间为 runtime_seconds 秒
float bytes_per_second = (float)stats.uart_tx_bytes / runtime_seconds;
float packets_per_second = (float)stats.uart_tx_count / runtime_seconds;
```

## 文件修改清单

1. **User/system_monitor.h**
   - 在 `SystemMonitorStats_t` 结构体中添加串口统计字段
   - 声明 `SystemMonitor_ReportUARTTx()` 和 `SystemMonitor_ReportUARTTxError()` 函数

2. **User/system_monitor.c**
   - 实现 `SystemMonitor_ReportUARTTx()` 函数
   - 实现 `SystemMonitor_ReportUARTTxError()` 函数
   - 更新 `SystemMonitor_SaveStatus()` 函数，在保存的日志中包含串口统计信息

3. **User/rs485_driver.c**
   - 包含 `system_monitor.h` 头文件
   - 在 `RS485_SendData()` 函数中添加监控调用

## 注意事项

1. **性能影响**: 监控函数调用非常轻量（仅增加计数器），对系统性能影响可忽略不计
2. **线程安全**: 当前实现未使用互斥锁，如果在多线程环境中使用，建议添加适当的保护机制
3. **计数器溢出**: 使用 `uint32_t` 类型，在高频发送场景下可能溢出，建议定期保存和重置统计数据
4. **错误统计**: 仅统计DMA启动失败的情况，不包括传输过程中的错误（如需要可在DMA错误回调中添加）

## 扩展建议

如需更详细的监控，可以考虑添加：
- 平均包大小统计
- 发送延迟统计
- 忙状态拒绝次数（`HAL_BUSY` 返回次数）
- 按时间段的发送速率统计
