我有几个arduino和一个树莓派通过rs485连接在一起
raspberry pi具有一个网络服务器,该服务器可以直接查询rs485行,还可以保留由crontab管理的自动查询,这些答案被保存在mysql DB中。
每个crontab作业执行相同的python脚本,然后执行要通过串行线路发送的字符串
问题:
crontab同时执行一些命令,并且串行数据重叠
独立查询可能会干扰计划中的查询
在打开串行端口之前,我尝试检查USB0端口是否为“ is_open”,但答案似乎仅是指在当前python脚本中运行的串行实例。
在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脚本保存标志,变量或独立脚本可以读取并了解是否使用串行端口的内容?
我做错了吗?
答案 0 :(得分:0)
如果我正确解释了您的问题,您可能会使用它,并结合其他一些逻辑:
import os
pids = os.system('fuser /dev/ttyUSB0')
基本上,这是称为Linux命令,该命令使用给定资源返回进程的pid。因此,对于您的问题,您可以仅检查USB装置是否没有其他程序。 fuser
的运行速度不是很快,但是应该可以完成工作。
答案 1 :(得分:0)
我建议您使用这些脚本,以将它们更新为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
将无法锁定该文件。
关闭文件后,锁将释放。
请注意,这是一个咨询锁,它不会阻止任何不尝试对设备进行植绒的人使用它。