周半梅 发表于 2025-6-1 08:58

用DMA收串口数据,遇上0x00就断了咋整

用IDLE方式配了接收,一遇0x00程序就提前触发,数据老是不完整。

Clyde011 发表于 2025-6-1 09:03

看下是不是驱动那边截断了数据。

公羊子丹 发表于 2025-6-1 09:04

你是不是用字符串函数判断长度了?

周半梅 发表于 2025-6-1 09:05

用0x00作为有效数据的话要小心啊。

帛灿灿 发表于 2025-6-1 09:05

试试用长度定长DMA,不靠结束符。

童雨竹 发表于 2025-6-1 09:06

可以改成环形缓冲区方式。

万图 发表于 2025-6-1 09:07

0x00是合法数据的话只能自己设定帧长。

Wordsworth 发表于 2025-6-1 09:08

IDLE+DMA要自己管头尾很麻烦。

Bblythe 发表于 2025-6-1 09:08

我之前也被0x00卡了半天……

Pulitzer 发表于 2025-6-1 09:09

建议用协议层重新设计一下。

Uriah 发表于 2025-6-1 09:10

接收数据加个校验位会更安全。

江河千里 发表于 2025-6-7 16:23

在STM32G0上使用DMA+IDLE中断接收串口数据时,遇到0x00导致提前触发或数据不完整的问题,通常与DMA配置、串口接收逻辑或IDLE中断处理机制相关

三生万物 发表于 2025-6-7 17:11

若DMA配置为8位数据宽度,但串口接收的是16位数据(如某些特殊协议),会导致数据解析错误。

一秒落纱 发表于 2025-6-7 17:36

IDLE中断在串口接收线空闲(无数据传输)时触发,而非检测到特定字节(如0x00)

光辉梦境 发表于 2025-6-7 18:44

一般来说,如果DMA缓冲区未初始化为0,残留数据可能导致IDLE中断误判

冰春彩落下 发表于 2025-6-7 19:13

若DMA缓冲区未填满,且未正确处理IDLE中断,可能导致数据截断。

夜阑风雨 发表于 2025-6-7 20:33

可能是协议中0x00表示数据结束,需在软件中手动检测,而非依赖IDLE中断

暖了夏天蓝了海 发表于 2025-6-7 21:00

IDLE中断用于检测数据流结束,而非特定字节(如0x00)。配置DMA接收数据到缓冲区。启用IDLE中断,在中断服务函数中标记数据接收完成。在软件中手动检测缓冲区中的0x00(若协议需要)

codingtuzi 发表于 2025-6-7 21:06

这个只能是软件处理吧!
硬件没有办法识别出来吧

远山寻你 发表于 2025-6-7 22:58

IDLE中断用于检测数据流结束,而非特定字节(如0x00)。配置DMA接收数据到缓冲区。启用IDLE中断,在中断服务函数中标记数据接收完成。在软件中手动检测缓冲区中的0x00(若协议需要)
页: [1]
查看完整版本: 用DMA收串口数据,遇上0x00就断了咋整