我正在从多个 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="")
问候 乔治
更优雅的循环方式
是的。 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 解码失败。
.read(1)
可能会阻塞很长一段时间。
如果你有N个端口,其中一个是空闲的,
你的循环会找到那个端口并卡在上面,
忽略到达其他 N - 1 个端口的数据。
你想使用非阻塞I/O,所以请求1 byte 可能会导致立即读取 0 字节。 或者您想在读取每个端口之前对其进行探测。 如果端口没有准备好,如果没有数据等待, 那么就不要尝试阅读它。