Pyserial:如何在打开串口前判断其是否空闲
我在用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
[编辑] 我故意把异常处理写成通用的,因为我认为实际的错误并不重要。无论出现什么错误,那条端口都不能用了...因为这个函数是用来测试端口是否可用的,所以出现异常的原因并不重要,重要的是你确实遇到了异常。