STM32G DMA串口发送接收
- 串口通信:通过 UART3 接收外部设备发送的 RGB 颜色命令,解析后通过 DMA 方式返回处理结果。
- 命令格式:接收形如
R:255,G:128,B:64
的字符串,分别对应红、绿、蓝三个通道的亮度值(0~255)。 - 错误处理:若命令格式错误或数值超出范围(非 0~255),返回
"ERROR"
;成功则返回"OK"
。 - 状态更新:解析成功后,将颜色值存储到
rgb_color
数组,供后续 LED 控制使用。
- 中断触发:当串口接收数据后进入空闲状态(IDLE),触发中断回调函数
UsarReceive_IDLE
。 - 数据捕获:
- 清除 IDLE 中断标志,停止当前 DMA 接收。
- 计算已接收数据长度
serialRxN
(通过 DMA 剩余计数推导)。 - 在接收缓冲区末尾添加字符串结束符
'\0'
。
- 命令解析:
- 使用
sscanf
解析字符串格式,提取 RGB 值。 - 校验格式有效性(返回值是否为 3)和数值范围(0~255)。
- 使用
- 响应处理:
- 成功:将解析的 RGB 值存入
rgb_color
数组,填充"OK"
到发送缓冲区。 - 失败:填充
"ERROR"
到发送缓冲区。
- 成功:将解析的 RGB 值存入
- 结果返回:通过 DMA 方式将响应发送回请求方。
- 循环接收:重新启动 DMA 接收,等待下一条命令。
- IDLE 中断:利用串口空闲中断(IDLE)高效捕获不定长数据,避免超时判断。
- DMA 传输:
- 接收:通过 DMA 自动将串口数据存入
uartRxBuf
,降低 CPU 负担。 - 发送:通过 DMA 异步发送响应数据,无需阻塞等待。
- 接收:通过 DMA 自动将串口数据存入
- 字符串解析:使用
sscanf
格式化提取数值,简化命令解析逻辑。