我正在尝试从python中的多个串行端口读取。但是与该线程相反,我希望能够动态更改端口数(通过命令行选项读取)。
我的想法是根据“端口”中的行数,将端口放入文件“端口”,读取此文件,然后将打开的串行端口放入列表中。我的最小示例:
import numpy as np
import serial
p = np.genfromtxt('ports',delimiter=',',dtype=None)
nser = p.size
ser = [serial.Serial(port=p[i][0], baudrate=p[i][1]) for i in xrange(nser)]
“端口”如下所示(目前):
'/dev/ttyUSB0',4800
错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: 0-d arrays can't be indexed
显然,该文件未正确读取到数组,并且我已经尝试了各种不同的方法和方式(使用pythons自己的方法或np.loadtxt)。
是否有人知道如何a)正确读取文件,b)以有用的方式解决多端口问题?提前致谢。
您的配置文件格式非常简单,无需numpy即可轻松解析。您可以使用简单的字符串拆分来加载每个端口定义。
serial_ports = []
with open('ports') as f:
for line in f:
port, baud = line.split(',')
serial_ports.append(serial.Serial(port, int(baud)))
或者您可以使用csv
模块:
import csv
with open('ports') as f:
serial_ports = [serial.Serial(port, int(baud)) for port, baud in csv.reader(f)]
问题的第二部分更加困难,因为您没有提供有关串行端口读取器将如何处理通过端口接收的数据的许多详细信息。
如果应用程序是受I / O约束的(这很可能是这种情况),则可以异步检查串行端口何时有一些要读取的数据,然后根据需要读取。这可以通过select()
模块来完成,或者如果您使用的是Python> = 3.4,则可以使用该selectors
模块。您不需要多个进程即可执行此操作。
如果应用程序受CPU限制,则可以使用mutiprocessing.Process()
或subprocess.Popen()
。与其在父级中打开串行端口,不如将串行端口参数作为参数/命令行参数传递给子级,然后传递给子级函数/进程,然后让子级打开端口,处理数据并关闭端口。
注意:未经测试-不知道这是否适用于串行端口。如果必须打开父级中的端口,则将子进程的stdin挂接到串行端口上。您需要注意这一点,因为很容易使父子进程相互阻塞的进程死锁。
from subprocess import Popen, PIPE
s = serial.Serial(port, baud)
p = Popen(['python', 'port_reader.py'], stdin=s, stdout=PIPE, stderr=PIPE)
p.communicate()
如果使用multiprocessing
,则可以将打开的串行端口作为参数传递给子代。这可能有用...?
from multiprocessing import Process
def child(port):
while True:
line = port.readline()
if not line:
break
print('child(): read line: {!r}'.format(line))
port = serial.Serial(port, baud)
p = Process(target=child, args=(port,))
p.start()
p.join()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句