Pyserial:如何在打开串口前判断其是否空闲

8 投票
1 回答
30980 浏览
提问于 2025-04-18 11:36

我在用Python和Pyserial库来操作串口,代码大概是这样的:

import serial
portName = 'COM5'

ser = serial.Serial(port=portName)

# Use the serial port...

但是,问题是,如果这个串口已经被其他应用程序打开了,比如说,尝试打开它的时候就会报错,错误信息是:"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...

编辑:

我找到了一种方法来解决这个问题:

import serial
from serial import SerialException

portName = 'COM5'

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

# Use the serial port...

1 个回答

3
def portIsUsable(portName):
    try:
       ser = serial.Serial(port=portName)
       return True
    except:
       return False

正如评论中提到的,要注意在频繁打开和关闭的情况下可能会出现竞争条件...

另外,直接返回串口对象或者返回None可能会更好。

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

[编辑] 我故意把异常处理写成通用的,因为我认为实际的错误并不重要。无论出现什么错误,那条端口都不能用了...因为这个函数是用来测试端口是否可用的,所以出现异常的原因并不重要,重要的是你确实遇到了异常。

撰写回答