- 新增配置管理器模块,支持从SD卡加载运行时配置 - 将数据输出模式从编译时宏改为运行时配置,提高灵活性 - 新增配置文件 `CONFIG.TXT`,支持串口输出和存储功能的动态开关 - 集成配置管理器到主程序,在系统启动时自动加载配置 - 更新数据存储模块,使用配置管理器管理会话序号 🐛 fix(usart): 修复USART3中断配置并优化波特率 - 添加USART3中断处理函数声明和实现 - 将USART3波特率从921600提升至2000000以提高通信速率 - 调整USART1中断优先级从2改为11,优化中断响应 - 在USART3 MSP初始化和反初始化中添加中断配置 📝 docs(user): 新增功能说明文档 - 新增《配置管理功能说明》文档,详细说明运行时配置的使用方法 - 新增《串口发送监控功能说明》文档,说明新增的串口统计功能 - 文档包含配置项说明、文件格式、使用示例和注意事项 ✨ feat(monitor): 增强系统监控功能 - 在系统监控统计中添加串口发送监控字段(发送次数、字节数、错误数) - 新增串口发送统计报告函数,集成到RS485驱动中 - 优化监控状态保存格式,采用精简格式减少文件写入阻塞时间 - 监控数据现在包含串口统计信息,便于性能分析和故障排查 ♻️ refactor(main): 重构主程序配置处理逻辑 - 移除编译时宏 `DATA_OUTPUT_MODE_UART` 和 `DATA_OUTPUT_MODE_STORAGE` - 使用 `Config_IsUartOutputEnabled()` 和 `Config_IsStorageEnabled()` 函数替代 - 优化数据存储启动逻辑,仅在存储功能启用时开始记录 - 添加配置加载成功/失败的调试输出信息
108 lines
3.5 KiB
Markdown
108 lines
3.5 KiB
Markdown
# 串口发送监控功能说明
|
||
|
||
## 概述
|
||
在系统监控模块中增加了串口(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` 返回次数)
|
||
- 按时间段的发送速率统计
|