Raspberry Pi 3 串口连接正常无数据读取问题求助
树莓派3串口无数据接收故障排查
系统配置核验
先确认以下配置项是否真正生效,这部分是最容易出疏漏的环节:
- 修改
/boot/config.txt添加enable_uart=1和dtoverlay=pi3-miniuart-bt后必须重启设备,配置才会加载,未重启的情况下所有配置改动都不生效。 - 重启后执行
ls -l /dev/serial0,正常应显示软链接指向/dev/ttyAMA0,如果指向/dev/ttyS0说明dtoverlay配置未生效,检查config.txt里是否有拼写错误、是否被其他配置覆盖。 - 执行
groups 你的当前用户名,确认用户在dialout用户组内,不在组内的普通用户没有串口设备的读写权限,执行sudo usermod -aG dialout 你的用户名后重启生效。 - 先排除硬件故障:将树莓派物理针脚8(TX/GPIO14)和针脚10(RX/GPIO15)短接,用串口工具自发自收,确认串口硬件通路正常;外接串口设备必须和树莓派共接GND,电平参考不一致时完全无法传输数据。
- 核对串口通信参数:除波特率外,数据位、停止位、校验位必须和对端设备完全匹配,pyserial默认参数为8位数据位、1位停止位、无校验,如果对端设备参数不同需要手动调整。
代码问题排查
你提供的代码存在多个会直接导致收不到数据的bug:
- 默认波特率错误
波特率下拉框默认选中索引为0的选项,对应波特率1200,绝大多数串口外设默认波特率为9600或115200,点击连接时如果没有手动选择波特率,串口会以1200波特打开,无法识别正常传输的数据。 - 异常捕获逻辑吞掉所有错误
连接串口的逻辑中仅捕获ValueError且直接pass,就算出现串口打开失败、权限不足、设备被占用等问题,也不会有任何报错提示,无法定位故障。 - 未设置串口读取超时
初始化串口时没有设置timeout参数,readline()默认工作在阻塞模式,如果对端发送的数据没有以\n结尾,读取操作会一直卡住等待换行符,不会返回任何数据。建议初始化时添加serialobj.timeout = 0.1,设置100ms读取超时,避免阻塞。 - 未做串口打开状态判断
连接逻辑中没有提前判断串口是否已经处于打开状态,多次点击连接按钮会重复调用open()触发异常,异常又被捕获逻辑吞掉,导致串口实际状态异常也无感知。 - 读取逻辑存在缺陷
仅通过in_waiting判断缓冲区有数据就调用readline(),如果缓冲区中暂存的数据不足一整行(未遇到换行符),要么触发阻塞,要么因为无超时设置读不到内容。
快速验证方法
先运行以下最小测试脚本,排除GUI逻辑干扰,确认串口本身是否能正常通信:
import serial import time ser = serial.Serial( port='/dev/ttyAMA0', baudrate=115200, # 替换为对端设备实际使用的波特率 parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=0.1 ) print(f"串口打开状态:{ser.is_open}") while True: raw_data = ser.readline() if raw_data: print(f"收到数据:{raw_data.decode('ascii', errors='ignore')}") time.sleep(0.01)
- 如果该脚本能正常收到数据,说明系统配置和硬件通路正常,回头修复GUI代码中的上述bug即可。
- 如果该脚本也无法收到数据,回到系统配置核验步骤,优先做短接自发自收测试,逐层排查问题。
内容的提问来源于stack exchange,提问作者shivanchal asthana
相关产品推荐
相关产品推荐

