使用两个Python脚本访问一个串口

使用两个Python脚本访问一个串口

我正在尝试使用/dev/ttyACM0两个 Python 脚本访问 Rasbperry 上的一个串行端口 ( ),这显然不起作用,因为一个会阻塞另一个。问题是一个脚本只需要从串行端口读取,而另一个脚本只需要写入。我无法组合这两个脚本,因为写入脚本仅每隔一段时间执行一次以发送一些命令,而读取脚本需要记录来自其他设备的偶尔消息(因此需要一直监听)。

串行通讯

我试着写一个第三Python 程序,充当脚本和单个串行端口之间的中继。它将容纳串行端口并将来自设备的传入数据写入虚拟端口 ( /dev/ttyACM0_read),读取脚本将从该虚拟端口读取。写入脚本将写入第二个虚拟端口 ( /dev/ttyACM0_write),中继程序从该端口读取数据并将其写入串行端口。这失败的当我无法创建虚拟端口时 ( "could not open port, no such file or directory")。关于创建虚拟串行端口的搜索没有带来任何有用的结果。

在搜索时我遇到了socat,但我无法确定它在这种情况下是否有任何用处,因为它(据我所知)只能在两个端口之间创建连接。

所以,也许有人可以告诉我如何创建一个虚拟端口,这样我就可以将它与我的中继 python 程序一起使用,或者有人针对我所处的单端口两个脚本困境提出了一种不同的解决方案。

平台信息:Linuxarmv6lstretchv9


更新:为了澄清我的用例,以下是我使用的 python 脚本:

写脚本- 在 Raspberry 上调用 URL ( hostname.local/foo) 时,串行端口会短暂打开并发送命令。

import web
import serial

urls = (
    '/foo', 'foo',
)

class foo:
    def GET(self):
        ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
        ser.write("<311>")
        ser.close()
        return "Success"

if __name__ == "__main__":
    app = web.application(urls, globals())
    app.run()

读脚本- 捕获来自串行端口的传入数据并将其写入文件。

import serial

ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)

while 1
    #If serial data is available, write it to txt file

ser.close()

使用虚拟端口没有具体原因,我只是认为这将是最简单的解决方案。

正如 @meuh 在评论中指出的那样,取消端口上的独占模式是可行的,但我无法使用以下方法实现这一点setserial

pi@pizero:~ $ setserial /dev/ttyACM0 ^session_lockout
Cannot set serial info: Operation not supported
pi@pizero:~ $ sudo setserial /dev/ttyACM0 ^session_lockout
pi@pizero:~ $ 

此后,没有任何变化,第二个 python 脚本像以前一样返回 EBUSY(设备或资源忙)。

相关内容