# 串口发送监控功能说明 ## 概述 在系统监控模块中增加了串口(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` 返回次数) - 按时间段的发送速率统计