Pyserial:如何在打开串行端口之前知道它是否可用

Ala*_*ain 7 python pyserial

我用python withPyserial来使用串口,​​代码是这样的:

import serial
portName = 'COM5'

ser = serial.Serial(port=portName)

# Use the serial port...
Run Code Online (Sandbox Code Playgroud)

但是,问题是,如果端口已经打开(由另一个应用程序为例),我得到一个错误,当我尝试打开它,如:"SerialException: could not open port 'COM5': WindowsError(5, 'Access is denied.')"

我想知道我是否可以在尝试打开端口之前打开它以避免此错误。我想使用一种条件并仅在可以时打开它:

import serial
portName = 'COM5'

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

# Use the serial port...
Run Code Online (Sandbox Code Playgroud)

编辑:

我找到了一种方法:

import serial
from serial import SerialException

portName = 'COM5'

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

# Use the serial port...
Run Code Online (Sandbox Code Playgroud)

Jor*_*ley 3

def portIsUsable(portName):
    try:
       ser = serial.Serial(port=portName)
       return True
    except:
       return False
Run Code Online (Sandbox Code Playgroud)

正如评论中提到的,在您打开和关闭很多的情况下,请注意竞争条件......

另外,最好只返回串行对象或 None

def getSerialOrNone(port):
    try:
       return serial.Serial(port)
    except:
       return None
Run Code Online (Sandbox Code Playgroud)

[编辑] 我故意将 except 作为包罗万象的东西,因为我认为实际的失败并不重要。因为无论错误如何,该端口都不可用...由于该函数正在测试端口的可用性,因此为什么会出现异常并不重要,只重要的是您会出现异常。

  • 嗯,“ except SerialException:”不是更好吗? (4认同)
  • 一般来说,我对捕获所有异常处理程序持谨慎态度。它们吞咽了太多信息,导致调试时间过长。您在这里给出的两个功能都没有真正增加任何价值。它们只是剥夺了您享受例外的好处。 (3认同)
  • 关于裸露的“例外”:这很糟糕,因为它不允许用户(或使用库的开发人员)区分原始开发人员*预期*(以某种方式处理)的异常和意外的异常。您只需像这样吞掉所有它们,并抑制有意义的信息(权限被拒绝?已经在使用?没有这样的端口?)。 (2认同)