PySerial 如何管理同时访问同一设备的多个进程/客户端? (也许是上下文管理?)

问题描述 投票:0回答:1

我有几个 IOT 型玩具(特别是功率计),它们提供用于配置和监控的 RS485 接口。使用基本的 USB<->RS485 桥接器,我能够与设备通信,读取输出数据并让它响应基本命令......一切都很好。

脚本是 pySerial 的超级基本用法。

get_values_str
只是要写入的一系列字节,它“询问”功率计的一组读数,然后
readline()
获取该数据。

import serial
from time import sleep

with serial.Serial('/dev/ttyUSB1', baudrate=115200, timeout=1) as serialHandle:
    get_values_str = b':R50=1,2,1,\n'
    for n in range(100):
        serialHandle.write(get_values_str)
        print(serialHandle.readline())
        sleep(10)

今天,当我错误地启动脚本的 second 实例时,我感到(愉快?)感到惊讶,并且它们都同时返回有效数据。我的印象是,访问串行端口/设备是一种排他性的东西(比如文件句柄?),而且不允许我同时拥有多个打开的上下文。

在稍微更一般的意义上,我希望了解允许多个客户端/进程访问此信息的最佳实践是什么......它似乎不断打开和关闭上下文管理器是错误的做 - 也许它并不昂贵,但它确实看起来是个坏主意。如果从多个地方访问 USB 设备的能力是正常的/受支持的,那么同时打开一堆上下文管理器可能 not 没什么大不了的,但这是我们要进入的部分我不太了解的领域。

我想理想情况下我只想有一个“始终可用”的函数来返回一行数据,但我完全不清楚上下文管理器和/或生成器的组合和/或我需要在这里考虑的锁定问题.

python pyserial contextmanager
1个回答
0
投票

我的印象是访问串行端口/设备是一种排他性的东西(比如文件句柄?)并且不允许我同时拥有多个打开的上下文。

你可以 allowed 多次打开一个设备,但你不能真正这样做有用。你很幸运,因为你的代码大部分时间都在休眠,所以只要你的两个脚本不同步,当一个脚本写入串行端口/从串行端口读取时,另一个脚本很有可能处于休眠状态.

不幸的是,如果他们碰巧同时与端口交互,你会变得混乱。

如果你想让多个东西访问一个串行端口,你写一个服务可以独占访问该端口,然后接受来自客户端的连接并将端口的数据“广播”到连接的客户端(gpsd 服务有效就像这样)。

或者,您可以设置一些备用通信通道,以便您的多个脚本可以协调它们对端口的访问。


为了避免意外结束在这种情况下,您可以在

exclusive构造函数中使用
serial.Serial
参数

with serial.Serial('/dev/ttyUSB1', baudrate=115200, timeout=1, exclusive=True) as serialHandle:
© www.soinside.com 2019 - 2024. All rights reserved.