私とよく似た質問が他にもあることは知っていますが、私が抱えている問題に対処するものはありません。
pyserial
を使用してシリアル ポート ( ) にアクセスしたい/dev/tty...
のですが、別のプロセスがまだ開いていないという条件でのみです。
次のスニペットは、1 回実行すると、Ubuntu 12.04 マシンで使用可能な 4 つのポートを返します。もう一度実行すると、使用可能なポートがないと予想されます。残念ながら、同じポートのリストが返されます。pyserial
別のプロセスがすでにポートを開いていることを特定できないようです。
SerialException
aがスローされるか、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 ...