其他分享
首页 > 其他分享> > pyserial无法识别树莓派3B+自身串口ttyS0的解决方案

pyserial无法识别树莓派3B+自身串口ttyS0的解决方案

作者:互联网

最近用python3(version ≥3.6)写了一个自动识别串口设备端口号的脚本,遇到一个问题:pyserial(version:3.5)无法识别树莓派3B+自身串口 ttyS0

使用树莓派3B+自身串口( ttyS0)连接产品时,在树莓派终端使用以下命令查询串口设备可以查到两个串口设备端口号:

ls -l /dev
ttyAMA0 ttyS0

但调用python3的pyserial模块只能查到其中一个端口号:

python3 -m serial.tools.list_ports -v
/dev/ttyAMA0
    desc: ttyAMA0
    hwid: 3f201000.serial
1 ports found

更悲摧的是我们真实使用的是ttyS0。

分析根本原因有两种可能:

1. pyserial 模块有 bug

2. 树莓派3B+ 设备系统参数配置不对

然而在网上找了好久,一直没找到相关的权威解释。无奈之下,结合产品自身特点做了一个迂回解决方案:

思路如下:

1. 如果只是使用树莓派3B+自身串口( ttyS0)连接产品,此时pyserial模块只能查到其中一个端口,而且不是我们所需要的,所以直接使用 “/dev/ttyS0” 做参数传入打开串口函数:

if platform.uname()[1] == 'raspberrypi':
    serialPort = '/dev/ttyS0'  # needed when plug in RaspberryPi
    ser = Communication(serialPort, 115200, 0.5)
    logger.info(f"Connect to usb serial port: {serialPort}.")

2.  如果使用树莓派3B+作为上位机 (使用树莓派3B+的usb端口,数据线,产品端使用 usb adapter连接产品,此时一般情况下应该使用串口号“/dev/ttyUSB0”连接产品),或者在使用树莓派3B+自身串口( ttyS0)连接产品的同时树莓派3B+的usb端口还连接着其他串口设备,此时pyserial模块会查到多个端口,同时还要考虑兼容其他操作系统平台,所以采用如下方案 - 如果是使用使用树莓派3B+,首先直接连接串口"/dev/ttyS0",下发串口命令, 通过检测串口命令的反馈情况,判断是否继续使用"/dev/ttyS0"连接产品,如果串口反馈的是空字符串b'',就使用pyserial模块查询到的串口号列表port_list_number中的第一个端口port[serialPortIndex](“/dev/ttyUSB0”):

Communication.Print_Used_Com()
port = port_list_number
total = len(port)
index = 0
for index in range(total):
    logger.info(f"port[{index}] is {port[index]} ")

if platform.uname()[1] == 'raspberrypi':
    serialPort = '/dev/ttyS0'  # needed when plug in RaspberryPi
    ser = Communication(serialPort, 115200, 0.5)
    logger.info(f"Connect to usb serial port: {serialPort}.")
    serialWriteByte(["d"])
    time.sleep(0.1)
    response = ser.main_engine.read_all()
    logger.info(f"Response is: {response}")
    if response == b'':
        ser.Close_Engine()
        logger.info(f"close the serial port: {serialPort}.")
        serialPortIndex = 0  # 0 means connect to port[0]; -1 means connect to the last port in the list
        ser = Communication(port[serialPortIndex], 115200, 0.5)
        logger.info(f"Connect to serial port: {port[serialPortIndex]}.")

参考:

ttyS0 Problems - Raspberry Pi Forums

Tools — pySerial 3.4 documentation

serial - Cannot detect ttyS0 in python RPi3b+ - Raspberry Pi Stack Exchange

pi 3 - How do I make serial work on the Raspberry Pi3 (PiZeroW, Pi4 or later models) - Raspberry Pi Stack Exchange

标签:树莓,ttyS0,dev,串口,3B,port
来源: https://blog.csdn.net/xiaodemon/article/details/122264994