python读取多个串行端口

罗伯特

我正在尝试从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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python Pyserial读取数据同时形成多个串行端口

来自分类Dev

Python Pyserial读取数据同时形成多个串行端口

来自分类Dev

从Ubuntu中的多个串行端口读取

来自分类Dev

从Ubuntu中的多个串行端口读取

来自分类Dev

Python:写入和读取串行端口

来自分类Dev

从Blazor的串行端口读取

来自分类Dev

具有多个事件的连续串行端口读取

来自分类Dev

Pycharm Kivy串行端口读取

来自分类Dev

vxworks串行端口读取超时

来自分类Dev

异步读取串行端口Boost

来自分类Dev

从C中的串行端口读取

来自分类Dev

从Windows中的串行端口读取

来自分类Dev

Python串行端口

来自分类Dev

处理从串行端口读取的数据时,串行端口线程锁定

来自分类Dev

Pharo:从Arduino串行端口读取字节

来自分类Dev

chrome扩展名-从串行端口读取

来自分类Dev

从串行端口Pyserial读取并写入C程序

来自分类Dev

唤醒阻止Linux中的串行端口读取

来自分类Dev

从串行端口读取和存储字节

来自分类Dev

如何从R中的串行端口读取数据

来自分类Dev

从串行端口C ++ Windows读取字节

来自分类Dev

从串行端口Linux C读取NULL字符

来自分类Dev

C#串行端口读取HEX数据

来自分类Dev

chrome扩展名-从串行端口读取

来自分类Dev

从串行端口读取时,随机算术溢出

来自分类Dev

从Cygwin下的USB串行端口读取

来自分类Dev

如何从QT的串行端口读取数据?

来自分类Dev

无法从串行端口读取。WaitCommEvent() 从不返回

来自分类Dev

从串行端口读取时接收截断的数据