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

时间:2018-12-23 20:59:23

标签: python multithreading pyserial

我有几个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脚本保存标志,变量或独立脚本可以读取并了解是否使用串行端口的内容?

我做错了吗?

2 个答案:

答案 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将无法锁定该文件。

关闭文件后,锁将释放。

请注意,这是一个咨询锁,它不会阻止任何不尝试对设备进行植绒的人使用它。