树莓派GPIO读取ASCII问题:IR传感器UART数据读取失败求助
解决树莓派UART读取IR传感器数据的问题
首先咱们得先找准核心问题:你现在的困境源于UART端口的配置冲突,以及没有正确初始化串口来接收传感器发来的格式数据。下面一步步帮你解决:
1. 先确保树莓派的UART端口可用
树莓派默认会把/dev/ttyAMA0分配给蓝牙(针对带蓝牙的型号,比如3B+、4B),或者启用了串口控制台,导致端口被占用——这就是你读串口返回空b''的主要原因。
配置步骤:
- 打开树莓派配置工具:
sudo raspi-config - 选择 Interface Options → Serial Port:
- 第一个问题"Would you like a login shell to be accessible over serial?" 选 No(禁用串口控制台,避免占用端口)
- 第二个问题"Would you like the serial port hardware to be enabled?" 选 Yes(启用硬件串口)
- 重启树莓派让配置生效:
sudo reboot
重启后,带蓝牙的树莓派会把硬件UART映射到/dev/ttyAMA0,蓝牙则转到/dev/ttyS0;老型号(比如2B)直接用/dev/ttyAMA0即可。
2. 停止混用GPIO输入模式
你之前同时把GPIO15配置成普通输入、又尝试用它做UART RX,这会造成引脚模式冲突。必须删掉所有GPIO相关的代码,让引脚工作在UART模式下。
3. 正确的串口读取代码
传感器会发送以<CR><LF>结尾的32字节ASCII格式数据,所以我们要确保串口参数和传感器完全匹配,并且持续监听数据(而不是只读一次):
import serial import time # 初始化串口,显式指定参数避免歧义 ser = serial.Serial( port='/dev/ttyAMA0', baudrate=115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 # 设置超时,避免程序一直阻塞 ) try: print("等待传感器数据...") while True: # 读取一行,直到收到CRLF结束符 data = ser.readline() if data: # 把二进制数据转成ASCII字符串并去掉首尾的换行符 decoded_data = data.decode('ascii').strip() print(f"收到数据: {decoded_data}") # 验证数据长度(去掉CRLF后应该是32字符) print(f"数据长度: {len(decoded_data)}") time.sleep(0.1) except KeyboardInterrupt: print("程序退出") finally: ser.close()
4. 排查其他可能的问题
- 接线检查:确认传感器的TX引脚接树莓派GPIO15(RXD0),传感器GND和树莓派GND共地,电源电压符合传感器要求(树莓派GPIO是3.3V,别接5V到GPIO引脚)。
- 波特率核对:仔细查传感器手册,确保它的波特率确实是115200,有些传感器需要通过引脚配置波特率。
- 硬件连通性测试:可以用USB转TTL模块,把树莓派TX(GPIO14)接模块RX,模块TX接树莓派RX(GPIO15),用串口助手发测试数据,看树莓派能否收到,排除硬件故障。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

