在Python中读取多个串行端口 - 如何简化、更优雅的循环方式?

问题描述 投票:0回答:1

我正在从多个 CDC 设备读取数据(出于测试目的,仅使用两个)。

我想知道是否有一种更优雅的方法来循环初始化和读取 CDC 端口。

作为 Python 新手,我想可以用更优雅的方式解决循环。

import serial
import serial.tools.list_ports

ports = serial.tools.list_ports.comports()

for port, desc, hwid in sorted(ports):
   print("{}: {} [{}]".format(port, desc, hwid ))

serialPort = {}

for i in range(len(ports)):
    try:
        serialPort[i] = serial.Serial(ports[i].device)
    except ValueError:
        print('Port Configuration problem')
    except serial.SerialException:
        print('Port not found or cannot be configured')

while True :

    for i in range(len(serialPort)):
        serialChar = serialPort[i].read(1)

        try:
            # Convert byte to string (character)
            serialChar = serialChar.decode("ascii")
        except UnicodeDecodeError:
            # Don't raise error if byte is not ASCII
            pass
        else:
            # Print the received byte in Python terminal
            print(serialChar, end="")
            if serialChar == 'z':
                print('\n', end="")

问候 乔治

python loops for-loop
1个回答
0
投票

Pythonic

更优雅的循环方式

是的。 OP 代码有点采用 Fortran / C 方法, 递增索引

i
来访问容器的元素。

Python 等现代语言喜欢这种迭代习惯:

    for x in xs:
        print(x)  # or otherwise do stuff with x

对于您的情况,我们可能有

for port in serial_ports:

统一码

OP 代码似乎假设几乎所有字符都读取 应关闭高位。 如果有大量有趣的多字节 unicode 字形 通过串口到达,OP输出将难以理解。

您可能会考虑至少显示一个

"?"
问号 对于每个 ASCII 解码失败。

阻塞 I/O

.read(1)
可能会阻塞很长一段时间。 如果你有N个端口,其中一个是空闲的, 你的循环会找到那个端口并卡在上面, 忽略到达其他 N - 1 个端口的数据。

你想使用非阻塞I/O,所以请求1 byte 可能会导致立即读取 0 字节。 或者您想在读取每个端口之前对其进行探测。 如果端口没有准备好,如果没有数据等待, 那么就不要尝试阅读它。

© www.soinside.com 2019 - 2024. All rights reserved.