从serial p访问Python readlines Api需要很长时间

2024-09-24 22:22:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有12个串行设备连接到我的电脑上,从一个设备上读取一个值需要大约4秒,下面的代码片段总共需要大约1分钟来读取所有值。它们是优化下面的python脚本的一种方法,还是使用其他API的方法,这些API可以减少串行访问设备和读取值的时间

代码段:

if sys.platform.startswith('linux'):
        for sfiles in glob.glob('/dev/serial/by-id/usb-XXXXdevNAME*'):
            try:
                s = serial.Serial(sfiles, 9600, timeout=2)
                s.write('XXXdeviceCommandToReadValue XXXX\r\n')
                response = s.readlines() // from the profiles it looks readlines is using more time 

探查器结果:

^{pr2}$

谢谢, 罗希思


Tags: 方法代码脚本apiif代码段sys时间
1条回答
网友
1楼 · 发布于 2024-09-24 22:22:49

如果设备是独立的;您可以同时读取它们的响应:

#!/usr/bin/env python
from glob import glob
from multiprocessing.pool import ThreadPool
import serial

def get_response(path):
    try:
        s = serial.Serial(path, 9600, timeout=2)
        s.write('XXXdeviceCommandToReadValue XXXX\r\n')
        return path, s.readlines(), None
    except Exception as e:
        return path, None, e

paths = glob('/dev/serial/by-id/usb-XXXXdevNAME*')
results = ThreadPool(min(len(paths), 20)).imap_unordered(get_response, paths)
for path, lines, error in results:
    print(path, lines, error) # handle results here

假设大部分时间都花在I/O上,代码应该会更快地完成。在

另外,研究在这种情况下s.readlines()是否是一个正确的API用法(在它之前是否需要s.flush())?你应该读一行还是一个固定的字节数。对于普通文件/管道,.readlines()将读取所有数据,直到EOF。检查它对串行设备是否有意义。在

相关问题 更多 >