Zephyr项目USART3串口终端输出乱码问题求助
问题:Zephyr项目中USART3串口输出乱码
配置与环境信息
prj.conf 配置
CONFIG_GPIO=y CONFIG_SERIAL=y CONFIG_UART_STM32=y CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y
已尝试过上述配置的不同组合。
设备树(USART3)配置
&usart3 { pinctrl-0 = <&usart3_tx_pd8 &usart3_rx_pd9 &usart3_de_pd12 &usart3_cts_pd11>; pinctrl-names = "default"; current-speed = <115200>; status = "okay"; };
注:该USART3用于RS485输出,引脚为典型配置。
核心代码(main.c)
#include <stdio.h> printf("LED state: %s\n", led_state ? "ON" : "OFF");
终端工具配置(picocom)
启动命令:
sudo picocom -b 115200 /dev/ttyUSB0
工具参数:
*** baud: 115200
*** flow: none
*** parity: none
*** databits: 8
*** stopbits: 1
*** dtr: up
*** rts: up
*** mctl: DTR:1 DSR:0 DCD:0 RTS:1 CTS:0 RI:0
现象
终端输出乱码:
(� �)�ӖV���) (� �)�Ӗ(����) (� �)�ӖV���) (� �)�Ӗ(����)
此前使用纯STM32 HAL+寄存器配置USART3时,可正常输出ASCII字符。
排查与解决建议
RS485方向控制配置缺失
该串口用于RS485输出,Zephyr默认不会自动处理DE引脚的方向切换,需在设备树和配置中补充RS485相关设置:- 在设备树中添加RS485属性:
&usart3 { // 保留原有配置 rs485-rts-active-low; // 根据硬件实际电平调整,DE通常与RTS绑定 rs485-rts-delay = <0 0>; // 发送前后延迟,单位ms,按需设置 status = "okay"; }; - 在prj.conf中开启RS485支持:
CONFIG_SERIAL_RS485=y
之前HAL配置中你手动控制了DE引脚,Zephyr下需通过上述配置让框架自动处理方向切换,否则发送时DE未正确置位会导致数据传输异常。
- 在设备树中添加RS485属性:
控制台串口映射错误
Zephyr默认可能将控制台绑定到其他串口(如USART1),需明确指定USART3为控制台:- 在设备树的USART3节点中添加
console;属性:&usart3 { console; // 指定该串口为系统控制台 // 保留原有配置 }; - 或在prj.conf中指定设备名:
(设备名需与Zephyr注册的设备一致,STM32平台通常为CONFIG_UART_CONSOLE_ON_DEV_NAME="USART3"USART3或uart3)
- 在设备树的USART3节点中添加
引脚复用配置验证
核对设备树中usart3_tx_pd8等引脚的复用定义,确保与STM32 HAL配置中的寄存器值一致,避免引脚功能配置错误。波特率偏差排查
尽管配置都是115200,但Zephyr时钟配置差异可能导致实际波特率偏移:- 在prj.conf中开启串口调试日志:
CONFIG_SERIAL_DEBUG=y,查看启动日志中USART3的波特率计算信息。 - 用示波器抓取TX引脚波形,测量实际波特率是否与115200一致。
- 在prj.conf中开启串口调试日志:
内容的提问来源于stack exchange,提问作者drerD
相关产品推荐
相关产品推荐

