为什么我的 COM 端口很忙?
Why are my COM ports busy?
我有一个 python 程序用于与微控制器通信。它像这样打开 com 端口:
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()
然后做一堆事情,发送和接收数据,直到我用键盘输入关闭程序:
except:
print("\n Program Interrupted...")
finally:
print("\n Closing Serial Port\n")
serial_connection.close()
一切正常。我的问题是当 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
并未显示它仍然是 运行ning。大约 30 秒 - 1 分钟后,我没有做任何事情,问题就消失了。
30 秒到 1 分钟的延迟是由于 RS232 协议的内部结构造成的。请参阅 setserial
命令 ( http://manpages.ubuntu.com/manpages/zesty/man8/setserial.8.html ) 中的 closing_wait
选项(默认 30 秒)当断开 USB 电缆并且连接被终止时协议等待 closing_wait
选项中指定的时间直到它关闭端口/会话。 session_lockout
禁止将第二个进程附加到打开的端口...
我有一个 python 程序用于与微控制器通信。它像这样打开 com 端口:
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()
然后做一堆事情,发送和接收数据,直到我用键盘输入关闭程序:
except:
print("\n Program Interrupted...")
finally:
print("\n Closing Serial Port\n")
serial_connection.close()
一切正常。我的问题是当 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
并未显示它仍然是 运行ning。大约 30 秒 - 1 分钟后,我没有做任何事情,问题就消失了。
30 秒到 1 分钟的延迟是由于 RS232 协议的内部结构造成的。请参阅 setserial
命令 ( http://manpages.ubuntu.com/manpages/zesty/man8/setserial.8.html ) 中的 closing_wait
选项(默认 30 秒)当断开 USB 电缆并且连接被终止时协议等待 closing_wait
选项中指定的时间直到它关闭端口/会话。 session_lockout
禁止将第二个进程附加到打开的端口...