You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:43:01