树莓派3B通过CP2102转UART与PC通信时接收乱码求助
解决树莓派3B UART乱码及发送失效问题
我来帮你一步步排查这个UART通信的问题,咱们从硬件到软件逐个确认:
1. 先检查硬件连接(最容易忽略的点)
- 确保CP2102的TX引脚接树莓派的RX引脚(GPIO15),CP2102的RX引脚接树莓派的TX引脚(GPIO14)——交叉连接是UART通信的基本要求,接反了肯定收不到或者乱码。
- 一定要把树莓派和CP2102的GND引脚连在一起,共地是串口通信稳定的关键,很多乱码问题都是因为没共地导致的信号干扰。
2. 换用树莓派的主UART(避免mini UART的波特率不稳定)
树莓派3B的ttyS0是mini UART,它的波特率会随CPU频率动态变化,很容易出现波特率不匹配导致的乱码。而ttyAMA0是性能更稳定的主UART,默认被蓝牙占用了,咱们把它切换到GPIO引脚:
- 编辑
/boot/config.txt文件:sudo nano /boot/config.txt - 添加或修改以下两行:
enable_uart=1 dtoverlay=pi3-disable-bt - 保存退出后重启树莓派:
sudo reboot
之后GPIO14/15就对应ttyAMA0了,后续操作都用这个串口设备。
3. 统一两边的串口参数
串口通信的波特率、数据位、停止位、校验位必须完全一致,任何一项不匹配都会乱码:
- 在树莓派上重新设置串口参数(以115200为例):
这个命令指定了115200波特率、8位数据位、1位停止位、无校验。sudo stty -F /dev/ttyAMA0 115200 cs8 -cstopb -parenb - 在Windows端,打开设备管理器找到CP2102对应的串口,右键进入「属性」→「端口设置」,把参数改成和树莓派完全一样的配置。
4. 修复sudo echo发送失效的问题
直接用sudo echo "ala 11 33" > /dev/ttyS0是无效的,因为重定向>是由当前shell处理的,而shell没有root权限。正确的写法是用tee命令:
echo "ala 11 33" | sudo tee /dev/ttyAMA0 > /dev/null
这样tee会以root权限把内容写入串口,> /dev/null是避免在终端重复输出内容。
5. 检查Python发送代码的问题
如果用Python发送,要注意以下几点:
- 确保安装了
pyserial库:sudo pip install pyserial - 代码里要使用正确的串口设备、参数,并且发送字节串(不是字符串):
import serial # 初始化串口,参数和两边保持一致 ser = serial.Serial('/dev/ttyAMA0', 115200, timeout=1) # 发送字节串,注意加b前缀 ser.write(b'ala 11 33\n') ser.close() - 有些串口助手需要收到换行符才会显示内容,所以末尾加
\n会更稳妥。
测试验证
- 在树莓派上执行
cat /dev/ttyAMA0,然后在Windows端用串口助手发送数据,看树莓派终端能不能正常显示。 - 用上面的
tee命令或Python代码发送数据,看Windows端是否收到正确内容。
内容的提问来源于stack exchange,提问作者Jakub Mrugał
相关产品推荐
相关产品推荐

