如何使用Python 2.7(可能还有pyserial)检查Linux中的串口是否已经打开(通过其他进程)?

前端之家收集整理的这篇文章主要介绍了如何使用Python 2.7(可能还有pyserial)检查Linux中的串口是否已经打开(通过其他进程)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我知道还有其他问题与我的问题非常相似,但它们都没有解决我遇到的问题.

我想使用pyserial来访问串口(/ dev / tty …),但仅限于另一个进程尚未打开它的情况.

以下代码段在我的Ubuntu 12.04计算机上返回四个可用端口,运行一次.如果我第二次运行它,我预计没有可用的端口.遗憾的是,返回了相同的端口列表.似乎pyserial无法识别另一个进程已经打开了端口.

我希望抛出一个SerialException,或者isOpen()方法返回False,但是pyserial很乐意多次打开.

import serial
from serial import tools
from serial.tools import list_ports


def available_ttys():
    for tty in serial.tools.list_ports.comports():
        try:
            port = serial.Serial(port=tty[0])
            if port.isOpen():
                yield port
        except serial.SerialException as ex:
            print 'Port {0} is unavailable: {1}'.format(tty,ex)


def main():
    ttys = []
    for tty in available_ttys():
        ttys.append(tty)
        print tty

    input('waiting ...')


if __name__ == '__main__':
    main()

无论我并行运行多少次,这都是输出

Port ('/dev/ttyS31','ttyS31','n/a') is unavailable: Could not configure port: (5,'Input/output error')
...
Port ('/dev/ttyS0','ttyS0','Input/output error')
Serial
最佳答案
正如@VooDooNOFX所说,防止其他进程打开同一个端口(设备)没有技术限制.但是,在Linux上,您可以锁定文件以防止应用程序多次使用同一端口.

import fcntl,serial

s = serial.Serial(0)
fcntl.flock(s.fileno(),fcntl.LOCK_EX | fcntl.LOCK_NB)

在这种情况下,您的应用程序将尝试在串行端口上获取独占锁(LOCK_EX).感谢LOCK_NB,如果任何其他进程已经锁定了串口,则调用将立即失败 – 通过提高IOError(或Python 3.3中的BlockingIOError子例外).

与其他解决方案相比,这有两个优点:

>您没有引入任何非标准文件,而是使用系统提供的方法,它带来了更好的互操作性,
>当您的进程退出时,会立即释放锁定,因此您不必担心过时的锁定.

所以,你的功能看起来像:

def available_ttys():
    for tty in serial.tools.list_ports.comports():
        try:
            port = serial.Serial(port=tty[0])
            if port.isOpen():
                try:
                    fcntl.flock(port.fileno(),fcntl.LOCK_EX | fcntl.LOCK_NB)
                except IOError:
                    print 'Port {0} is busy'.format(tty)
                else:
                    yield port
        except serial.SerialException as ex:
            print 'Port {0} is unavailable: {1}'.format(tty,ex)
原文链接:https://www.f2er.com/linux/440311.html

猜你在找的Linux相关文章