Python Pyserial:如何在打开串口之前知道它是否空闲

Python Pyserial:如何在打开串口之前知道它是否空闲,python,pyserial,Python,Pyserial,我使用python和Pyserial来使用串行端口,代码如下: import serial portName = 'COM5' ser = serial.Serial(port=portName) # Use the serial port... 但是,问题是,如果端口已经打开(例如,由另一个应用程序打开),我在尝试打开它时会遇到一个错误,如:“SerialException:无法打开端口'COM5':WindowsError(5,'访问被拒绝')” 我想知道在尝试打开端口之前是否可以打开

我使用python和
Pyserial
来使用串行端口,代码如下:

import serial
portName = 'COM5'

ser = serial.Serial(port=portName)

# Use the serial port...
但是,问题是,如果端口已经打开(例如,由另一个应用程序打开),我在尝试打开它时会遇到一个错误,如:
“SerialException:无法打开端口'COM5':WindowsError(5,'访问被拒绝')”

我想知道在尝试打开端口之前是否可以打开端口以避免此错误。我想使用一种条件,只有在我能够:

import serial
portName = 'COM5'

if portIsUsable(portName):
    ser = serial.Serial(port=portName)

# Use the serial port...
编辑:

我找到了一种方法:

import serial
from serial import SerialException

portName = 'COM5'

try:
    ser = serial.Serial(port=portName)
except SerialException:
    print 'port already open'

# Use the serial port...
正如在评论中提到的,在你经常开盘和收盘的情况下,要注意比赛情况

另外,最好只返回串行对象或不返回任何对象

def getSerialOrNone(port):
    try:
       return serial.Serial(port)
    except:
       return None

[编辑]我故意将“除此之外”作为一个包罗万象的选项,因为我认为实际的失败并不重要。不管发生什么错误,该端口都不可用。。。由于该函数正在测试端口的可用性,因此出现异常的原因无关紧要,而只与出现异常有关。

只需执行
尝试:打开端口,但错误除外:通过
只需使用
尝试..except
阻止并捕获异常。否则您将引入一个潜在的。我尝试使用try.。除了这样:
try:ser=serial.serial(port=portName)除了ValueError:pass
之外,我在python控制台中也遇到了一个错误,我不想避免它。当引发的实际exoption是
SerialException
时,为什么要尝试捕获
ValueError
?使用
try..exception SerialException
(并预先从适当的位置导入
SerialException
)。只需捕获所有内容。。。谁在乎它为什么不起作用唯一重要的是它不起作用。。。如果它因为任何原因都不起作用,那么它就不可用了……嗯,除了SerialException:
,使用
不是更好吗?为什么?函数的定义是可移植的。。。谁在乎它为什么失败。。。如果它因任何原因失败,那么根据定义它是不可用的
isportable(“GARBAGE”)==False
即使“GARBAGE”会引发IOError(至少我认为…也许我应该检查)(nm它仍然会引发串行异常…但我仍然坚持这样的说法:“它为什么失败并不重要,只是它失败了”…在本例中)我通常对捕获所有异常处理程序都很谨慎。它们吞噬了太多的信息,这会导致长时间的调试会话。这里给出的两个函数都没有真正增加任何值。它们只是剥夺了例外的好处。@JoranBeasley恐怕你在第一个例子中引入了OPs坏模式。使用
try..except
避免争用条件的要点是避免像
portissuable()
这样的检查-如果您只是在这样一个函数中插入
try..except
,然后执行
if portissuable())
你的竞争条件就像你在没有尝试的情况下做了同样的事情一样。除了
。关于裸的
除了:这是不好的,因为它不允许用户(或使用库的开发人员)区分原始开发人员预期的异常(以某种方式处理)和意外的异常。您只需像这样吞下所有这些端口,并抑制有意义的信息(权限被拒绝?已经在使用?没有这样的端口?)。
def getSerialOrNone(port):
    try:
       return serial.Serial(port)
    except:
       return None