判断串口丢字节,核心是协议层和驱动层结合。最直接的方法是使用DMA+空闲中断接收,并在接收回调中检查DMA剩余计数(NDTR)是否与预期长度匹配。若使用轮询,可对比每次读取的字节数与缓冲区剩余空间。
实操建议:
1. **加帧头帧尾+长度校验**:定义帧格式如`0xAA 0x55 len data... checksum`,接收时校验len和checksum,不匹配即丢帧。
2. **使用硬件流控**(RTS/CTS)可减少因缓冲溢出导致的丢字节,但需双方支持。
3. **统计中断触发频率**:若串口中断频繁且处理耗时,可开DMA或提高中断优先级。
示例(STM32 HAL库,DMA接收):
```c
uint8_t rx_buf[256];
HAL_UART_Receive_DMA(&huart1, rx_buf, 256);
// 在RxCpltCallback中检查剩余数据
uint16_t remaining = __HAL_DMA_GET_COUNTER(huart1.hdmarx);
uint16_t received = 256 - remaining;
if (received != expected_len) { /* 丢字节处理 */ }
```
注意:丢字节常因波特率不匹配、中断优先级低或缓冲区过小。先用示波器看波形,排除硬件问题。
mcuku 阿沐 · 2026-08-19