多个 python 脚本可以与单个串行端口通信吗?

Can multiple python scripts communicate with a single serial port?

我有几个 arduino 和一个 raspberry pi 通过 rs485

连接在一起

raspberry pi 有一个网络服务器,允许直接查询 rs485 线路,还允许调度自动查询,由 crontab 管理,答案保存在 mysql 数据库中。

每个 crontab 作业执行相同的 python 脚本,后跟要通过串行线发送的字符串

问题:

在打开串口之前,我尝试检查 USB0 端口是否 "is_open",但似乎答案仅指当前 python 脚本中的串口实例 运行ning

运行宁在python:

ser = serial.Serial(serPath,38400,timeout=1.0)

然后 运行使用此脚本:

#!/usr/bin/python
import serial
ser = serial.Serial()
ser.port = '/dev/ttyUSB0'
ser.baudrate = 38400
ser.timeout = 1.0
print(ser.is_open)
# always returns False
ser.open()
print(ser.is_open)
# always returns True

如果我执行

print(ser)

我可以看到每次我的序列号都不一样 运行

ser = serial.Serial()

有没有办法知道串行USB0是空闲还是忙碌?

作为替代方案,有没有一种方法可以使用 python 脚本来保存标志、变量或独立脚本可以读取并理解是否使用串口的东西?

我做错了吗?

如果我正确解释了你的问题,你可能只需要使用它,再搭配一些其他逻辑:

import os

pids = os.system('fuser /dev/ttyUSB0')

本质上,它所做的是调用 Linux 命令,该命令 returns 使用给定资源的进程的 pids。因此,对于你的问题,你可以检查一下是否有其他程序在使用usb设备。它 fuser 不是很快,但应该可以完成工作。

我建议您将这些脚本更新到 flock 串口设备:

import fcntl
s = open('/dev/ttyUSB0')
# you have a choice of either blocking or not
fcntl.flock(s, fcntl.LOCK_EX) 
# blocks
fcntl.flock(s, fcntl.LOCK_EX | fcntl.LOCK_NB) 
# raises IOError: [Errno 11] Resource temporarily unavailable

如果每个脚本在尝试使用设备之前都聚集在设备上,那么一次只能有一个脚本在使用该设备,因为第二个脚本会阻塞,或者 LOCK_NB 将无法锁定文件.

文件关闭时释放锁。

请注意,这是一个建议锁,它不会阻止任何未尝试聚集设备的人使用它。