python读取多个串口

7 浏览
0 Comments

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)以有用的方式解决多串口问题吗?提前感谢。

0
0 Comments

问题:如何用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')

请注意,以上方法是否符合您的需求不确定。

0
0 Comments

问题出现的原因是配置文件的格式很简单,可以很容易地使用字符串分割来加载每个串口定义。解决方法是可以使用简单的字符串分割来加载每个串口定义,也可以使用csv模块来实现。

第二部分的问题更加困难,因为没有提供关于串口读取器如何处理接收到的数据的详细信息。如果应用程序是I/O绑定的,最可能的情况是使用select()模块或者使用Python >= 3.4的selectors模块来异步检查串口是否有数据可读,然后根据需要读取数据。不需要使用多个进程来实现这个功能。

如果应用程序是CPU绑定的,可以使用multiprocessing.Process()或者subprocess.Popen()。不是在父进程中打开串口,而是将串口参数作为参数/命令行参数传递给子进程函数/进程,并让子进程打开串口、处理数据并关闭串口。

如果必须在父进程中打开串口,可以将子进程的stdin连接到串口。需要小心使用,因为容易在父进程和子进程之间产生相互阻塞的死锁。

使用multiprocessing时,可以将打开的串口作为参数传递给子进程。这可能会起作用...

以上是对问题出现原因和解决方法的整理。

0