升级glibc至2.29后树莓派4配置串口报输入输出错误求解决
解决glibc-2.29环境下树莓派4打开/dev/ttyS0串口的IO错误问题
针对你在树莓派4上升级glibc到2.29后,Python串口程序出现serial.serialutil.SerialException: Could not configure port: (5, 'Input/output error')的问题,可尝试以下几种解决方案:
1. 修复串口设备权限
- 将当前用户加入dialout组(串口操作的权限组):
执行后重新登录系统生效,避免每次运行程序都需要sudo权限。sudo usermod -aG dialout $USER - 临时测试可直接修改设备权限(重启后失效):
sudo chmod 666 /dev/ttyS0
2. 确认树莓派串口硬件配置
glibc升级后可能暴露了之前被忽略的串口配置问题:
- 打开树莓派配置工具:
sudo raspi-config - 进入
Interface Options->Serial Port - 选择**"否"关闭串口控制台**,选择**"是"启用串口硬件支持**
- 重启树莓派:
sudo reboot - 验证硬件串口映射:执行
ls -l /dev/serial*,确保/dev/ttyS0链接到/dev/ttyAMA0(硬件串口),而非miniUART(/dev/ttyS0默认可能是miniUART,性能受限且易出配置问题)。
3. 显式配置所有串口参数
glibc-2.29对串口参数的默认处理更严格,需在代码中显式声明所有必要配置,避免依赖pyserial的默认值:
import serial import GPIO # RS485初始化修改版 def RS485_initial(self): MODE = 0 # mode = 0是全双工,mode = 1是半双工 if MODE == 1: EN_485 = 4 GPIO.setmode(GPIO.BCM) GPIO.setup(EN_485, GPIO.OUT) GPIO.output(EN_485, GPIO.HIGH) # 显式指定所有串口参数 self.ser = serial.Serial( port="/dev/ttyS0", baudrate=115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_1, bytesize=serial.EIGHTBITS, timeout=1, xonxoff=False, rtscts=False, dsrdtr=False ) # RS232初始化修改版 def RS232_initial(self): self.ser = serial.Serial( port="/dev/ttyS0", baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_1, bytesize=serial.EIGHTBITS, timeout=1, xonxoff=False, rtscts=False, dsrdtr=False )
4. 调整pyserial版本适配glibc-2.29
部分旧版本pyserial与glibc-2.29的系统调用处理不兼容:
- 卸载当前版本:
pip3 uninstall pyserial - 安装兼容版本(推荐3.4或最新稳定版):
pip3 install pyserial==3.4 # 或升级到最新版 pip3 install --upgrade pyserial
5. 用strace定位具体出错的系统调用
如果以上方案无效,可通过strace跟踪程序的系统调用,定位具体哪个配置步骤出错:
strace -e trace=ioctl python3 your_serial_script.py
查看输出中失败的ioctl调用及其参数,针对性修改pyserial的serialposix.py源码(比如在_reconfigure_port方法中添加参数检查或调整系统调用逻辑)。
内容的提问来源于stack exchange,提问作者Rossi
相关产品推荐
相关产品推荐

