多个 python 脚本可以与单个串行端口通信吗?
Can multiple python scripts communicate with a single serial port?
我有几个 arduino 和一个 raspberry pi 通过 rs485
连接在一起
raspberry pi 有一个网络服务器,允许直接查询 rs485 线路,还允许调度自动查询,由 crontab 管理,答案保存在 mysql 数据库中。
每个 crontab 作业执行相同的 python 脚本,后跟要通过串行线发送的字符串
问题:
crontab同时执行部分命令,串口数据重叠
独立查询可能会干扰计划的查询
在打开串口之前,我尝试检查 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
将无法锁定文件.
文件关闭时释放锁。
请注意,这是一个建议锁,它不会阻止任何未尝试聚集设备的人使用它。
我有几个 arduino 和一个 raspberry pi 通过 rs485
连接在一起raspberry pi 有一个网络服务器,允许直接查询 rs485 线路,还允许调度自动查询,由 crontab 管理,答案保存在 mysql 数据库中。
每个 crontab 作业执行相同的 python 脚本,后跟要通过串行线发送的字符串
问题:
crontab同时执行部分命令,串口数据重叠
独立查询可能会干扰计划的查询
在打开串口之前,我尝试检查 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
将无法锁定文件.
文件关闭时释放锁。
请注意,这是一个建议锁,它不会阻止任何未尝试聚集设备的人使用它。