6

私とよく似た質問が他にもあることは知っていますが、私が抱えている問題に対処するものはありません。

pyserialを使用してシリアル ポート ( ) にアクセスしたい/dev/tty...のですが、別のプロセスがまだ開いていないという条件でのみです。

次のスニペットは、1 回実行すると、Ubuntu 12.04 マシンで使用可能な 4 つのポートを返します。もう一度実行すると、使用可能なポートがないと予想されます。残念ながら、同じポートのリストが返されます。pyserial別のプロセスがすでにポートを開いていることを特定できないようです。

SerialExceptionaがスローされるか、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', 'n/a') is unavailable: Could not configure port: (5, 'Input/output error')
Serial<id=0x7fca9d9f1c90, open=True>(port='/dev/ttyUSB1', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
Serial<id=0x7fca9d9f1cd0, open=True>(port='/dev/ttyACM2', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
Serial<id=0x7fca9d9f1e50, open=True>(port='/dev/ttyACM1', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
Serial<id=0x7fca9d9f1ed0, open=True>(port='/dev/ttyACM0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
waiting ...
4

2 に答える 2

3

Linux には、複数のプロセスが同じシリアル ポートを開くのを防ぐものは何もありません。したがって、pyserial ライブラリがこれを行うことができる理由です。ただし、他の場所で十分に文書化されている標準的な規則があります。

一般的なプロセスでは、デバイスを開き、PID を含むテキスト ファイルを/tmpまたはディレクトリに作成する必要があります。/var/lock2 番目のスクリプトは、このファイルの存在を検索し、存在するポートを開くことを拒否します。

詳細については、http ://www.tldp.org/HOWTO/Serial-HOWTO-13.html を参照してください。

于 2013-11-06T20:59:52.690 に答える