python读取多个串口
python读取多个串口
我正在尝试在Python中从多个串口读取数据。但与这个线程相反,我希望能够动态更改串口的数量(通过命令行选项进行读取)。
我的想法是将串口放入一个名为"ports"的文件中,读取该文件并将打开的串口放入一个列表中,根据"ports"中的行数确定数量。这是我的简单示例:
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)]
"ports"文件的内容如下(目前):
'/dev/ttyUSB0',4800
错误信息:
Traceback (most recent call last): File "", line 1, in IndexError: 0-d arrays can't be indexed
显然,文件没有正确读取为数组,我已经尝试了各种不同的方法和方式(使用Python自己的方法或np.loadtxt)。
有人有什么办法可以a)正确读取文件并b)以有用的方式解决多串口问题吗?提前感谢。
问题:如何用Python读取多个串口?
原因:根据提供的文件内容,需要将其读取并存储为一个列表。
解决方法:
with open('ports.txt') as f: lines = f.read().replace('\n', ',') print lines
将会得到:
'/dev/ttyUSB0',4800,'/dev/ttyUSB1',4801,'/dev/ttyUSB3',4803
如果需要将整数分离出来,可以使用以下代码:
l1 = [lines.pop(i) for i,j in enumerate(lines) if type(j)==int] print l1 print lines
将会得到:
[4800, 4801, 4803] ['/dev/ttyUSB0', '/dev/ttyUSB1', '/dev/ttyUSB3']
如果之前尝试使用`np.loadtxt`函数时出现问题,可以使用以下代码将Python列表转换为NumPy数组:
lines = ['/dev/ttyUSB0',4800,'/dev/ttyUSB1',4801,'/dev/ttyUSB3',4803] import numpy as np np.asarray(lines)
将会得到:
array(['/dev/ttyUSB0', '4800', '/dev/ttyUSB1', '4801', '/dev/ttyUSB3', '4803'], dtype='|S12')
请注意,以上方法是否符合您的需求不确定。
问题出现的原因是配置文件的格式很简单,可以很容易地使用字符串分割来加载每个串口定义。解决方法是可以使用简单的字符串分割来加载每个串口定义,也可以使用csv模块来实现。
第二部分的问题更加困难,因为没有提供关于串口读取器如何处理接收到的数据的详细信息。如果应用程序是I/O绑定的,最可能的情况是使用select()模块或者使用Python >= 3.4的selectors模块来异步检查串口是否有数据可读,然后根据需要读取数据。不需要使用多个进程来实现这个功能。
如果应用程序是CPU绑定的,可以使用multiprocessing.Process()或者subprocess.Popen()。不是在父进程中打开串口,而是将串口参数作为参数/命令行参数传递给子进程函数/进程,并让子进程打开串口、处理数据并关闭串口。
如果必须在父进程中打开串口,可以将子进程的stdin连接到串口。需要小心使用,因为容易在父进程和子进程之间产生相互阻塞的死锁。
使用multiprocessing时,可以将打开的串口作为参数传递给子进程。这可能会起作用...
以上是对问题出现原因和解决方法的整理。