2017-09-25 20 views
1

私はマイクロコントローラと話すために使用しているPythonプログラムを持っています。私のCOMポートがビジーなのはなぜですか?

except: 
    print("\n Program Interrupted...") 
finally: 
    print("\n Closing Serial Port\n") 
    serial_connection.close() 

このすべてが正常に動作します:私は、キーボードinterputで、このようなプログラムを閉じるまで、データの送受信、

def STM32_connect(): 
    ports = list(serial.tools.list_ports.comports()) 
    for p in ports: 
     if "STM32" in p.description: 
      connection = serial.Serial(p.device, timeout = .01) 
      return(connection) 
    print("ERROR: No STM32 Device Found") 
    sys.exit() 

serial_connection = STM32_connect() 

をそして、物事の束を行います。それはこのようにCOMポートを開きます。私の問題は、PythonスクリプトがUSBケーブルを切断するか、ボードの電源を切って、私がもうCOMポートのマイクロに接続できなくなって、誤って殺されたときです。

Traceback (most recent call last): 
    File "/home/---/.local/lib/python3.5/site-packages/serial/serialposix.py", line 265, in open 
    self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK) 
OSError: [Errno 16] Device or resource busy: '/dev/ttyACM2' 

During handling of the above exception, another exception occurred: 

    Traceback (most recent call last): 
     File "flextester.py", line 1, in <module> 
     from flex_usb_class import * 
     File "/home/---/Code/RobotFlexTester/flex_usb_class.py", line 30, in <module> 
     serial_connection = STM32_connect() 
     File "/home/---/Code/RobotFlexTester/flex_usb_class.py", line 25, in STM32_connect 
     connection = serial.Serial(p.device, timeout = .01) 
     File "/home/---/.local/lib/python3.5/site-packages/serial/serialutil.py", line 240, in __init__ 
     self.open() 
     File "/home/janey/.local/lib/python3.5/site-packages/serial/serialposix.py", line 268, in open 
     raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg)) 
    serial.serialutil.SerialException: [Errno 16] could not open port /dev/ttyACM2: [Errno 16] Device or resource busy: '/dev/ttyACM2' 

私はCOMポートを変更できますが、別のttyACMポートでも同じエラーが発生します。しかし、私は別のpythonスクリプトを実行しようとすると、同じポート上の同じデバイスに接続することができます。問題は何らかの形で初期テストスクリプトにロックされているようですが、ps -aはまだ実行中であることを示していません。 30秒後〜1分後に何もせずに問題が解消します。

答えて

1

30秒から1分の遅延は、RS232プロトコルの内部によるものです。 USBケーブルを取り外すときにコマンド(http://manpages.ubuntu.com/manpages/zesty/man8/setserial.8.html)のclosing_waitオプション(デフォルトは30秒)を参照してください。接続が終了すると、プロトコルはポート/セッションを閉じるまで、closing_waitオプションで指定された時間待ちます。 session_lockoutは、開いたポートに第2のプロセスを接続することを禁じています。

関連する問題