我有一个使用串行端口 /dev/ttyUSB0
的 python 应用程序(“App1”)。此应用程序作为 Linux 服务运行。它运行得很好,因为它完全自动化地完成了我需要它执行的任务。但是,我最近开始意识到,有时我不小心将同一个串行端口用于我正在开发的另一个 python 应用程序,这会对“App1”造成不必要的干扰。
我确实尝试如下锁定“App1”:
ser=serial.Serial(PORT, BAUDRATE)
fcntl.lockf(ser, fcntl.LOCK_EX | fcntl.LOCK_NB)
但是,对于其他应用程序,我有时会在不知不觉中使用
ser=serial.Serial(PORT, BAUDRATE)
不检查 ser.isOpen()
为了防止这种情况发生,我在处理其他应用程序时想知道,ser=serial.Serial(PORT, BAUDRATE)
是否有办法通知我串口是当我尝试访问它时已经在使用中?
我想出的一个解决方案是创建一个永远运行的 cronjob
,它主要检查以下内容:
fuser -k /dev/ttyUSB0 #to get the PID of activated services that uses /dev/ttyUSB0
pkill -f <PID of second application shown in output above> #kill the application belonging to the second PID given by the above command
以上将确保每当两个应用程序使用同一个串行端口时,第二个 PID 将被杀死(我知道此逻辑中存在一些漏洞)。你们有什么感想?如果这不是一个好的解决方案,ser=serial.Serial(PORT, BAUDRATE)
是否有任何方法通知我 /dev/ttyUSB0
已在使用中我尝试访问它还是需要在驱动程序级别实现逻辑?任何帮助将不胜感激!
最佳答案
我认为更简单的做法是为“稳定进程”创建一个不同的用户,并使用普通文件权限授予该用户对 /dev/ttyUSB0
的独占访问权限。 .
有了 Unix 组和仍然简单的权限,其他进程仍然可以访问它需要的任何其他资源,这些资源将在您的主要用户下 - 所以它应该很简单
如果您不知道它们,请查看命令的文档 chown
和 chmod
.
关于python - 特定 python 应用程序的安全串行端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57208366/