串口接收不定长数据用什么方案?

嵌入式 · 硬件工程师 · 126 浏览
串口接收不定长数据用什么方案?

回答(4)

口诀:不定长,靠空闲;想省事,DMA 搬。帧头帧尾做保险,超时兜底不卡死。(IDLE 中断 + DMA 双缓冲 + 帧头校验 = 标准答案)
RTOS小能手 · 2026-10-23
补充一个工程实例:之前做 4G 透传模块,用 HAL_UARTEx_ReceiveToIdle_DMA,接收完成回调里拿 rxSize 直接解析,一帧 128 字节 115200 波特率下 CPU 占用几乎为 0。注意点:1. 环形缓冲要开够大(2 倍最大帧长)2. 解析时先找帧头再算长度 3. 超时保护必须有,防止半帧卡死 4. 中断回调里别做耗时操作,只置位。
嵌入式老鸟 · 2026-10-23
串口不定长接收常用两种方案:1. 空闲中断(IDLE):STM32 等 MCU 的 USART 有 IDLE 中断,一帧数据后总线空闲即触发,此时 DMA 搬运完毕,直接读长度,效率最高,适合大流量。2. 帧头帧尾+超时:自定义协议(如 0xAA 0x55 开头 + 校验 + 0x0D 0x0A 结尾),接收时用超时定时器(如 3.5 字符时间)判断结束。3. 也可以固定帧长 + 帧头定位,但灵活性差。推荐:DMA + IDLE 中断是主流做法,中断里只置标志位,主循环处理。
曹雪嵌入式软件 · 2026-10-23
★ 精华
{"answer":"串口接收不定长数据,核心问题是识别帧边界和长度。常用方案:\n\n1. 帧协议:定义帧头、长度、数据、校验,如 AA 55 LEN DATA CRC,接收端按帧头+长度解析。\n2. 空闲中断(IDLE):MCU检测到总线空闲时触发中断,配合DMA实现高效接收。推荐使用 DMA + IDLE:DMA连续接收,IDLE中断时从DMA获取本次接收长度,复位接收。\n3. 定时器超时:每收到字节重置一个定时器,超时未收到新数据则视为一帧结束。适合非DMA场景,注意定时器分辨率。\n4. 特殊结束符:如回车换行,适用于AT指令。\n\n实操建议:优先采用DMA+IDLE+环形缓冲区,CPU占用低且可靠。协议务必定义最大帧长和校验(CRC/累加和),防止粘包/断包。使用状态机解析帧头/长度/数据,避免阻塞处理。\n\n示例(STM32 HAL):\n```c\n// 开启UART DMA接收,空闲中断回调中处理\nvoid HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {\n if (huart == &huart
mcuku 阿沐 · 2026-08-13

🧰 配套工具

🔗 波特率计算器