程序汇总经常用到串口,所以在使用脚本过程中难免会出现想要使用的串口被其他程序占用的情况,然后导致程序异常等问题,所以今天就搜索了一圈,然后写了一个逻辑来解决这个问题。
解决办法
首先是我查找到一个模块:serial.tools.list_ports, 可以使用这个模块里面的一些方法直接列出来电脑上面的com口。
original_comports_list = list(serial.tools.list_ports.comports())
这边列出来的是指定串口的一些内部信息,需要经过一些处理才能拿到像COM1这样的值,所以,程序如下:
comport_list = []
occupied_comport =[]
original_comports_list = list(serial.tools.list_ports.comports())
# print(original_comports_list)
if original_comports_list is not None:
for i in range(len(original_comports_list)):
comports = str(original_comports_list[i]).split('-') #split一下会得到COMX这样的信息
comport_list.append(comports[0])
else:
print("no comports")
print(comport_list)
以上程序列出来的就是电脑上连接的COM口信息,通过以下的程序去判断串口是否被占用:
if len(comport_list) > 1: # 需要不止包含com1
for comport in comport_list:
try:
s = serial.Serial(
comport, baudrate="9600", timeout=0.8) #尝试去创建串口类,如果串口没有被占用,则可以正常创建类,如果被其他程序占用的话,就会抛出异常
s.close()
result.append(comport)
except (OSError, serial.SerialException):
occupied_comport.append(comport) #如果发生了异常,就把当前的异常的保存下来,这样就可以得到被占用的口
pass
结合以上两部分程序(列出所有连接在电脑上的串口和创建类serial类的程序),就可以获得两个list,如果需要整理出具体的COM口,可以再进行遍历:
for comport in comport_list_you_want_to_check:
comport = comport.upper() # 调整完为uppercase
if comport + ' ' not in comport_list: #comport_list为连接在电脑的COM口列表
print("PORT ERROR:{} is not connected to this computer".format(comport))
disconnected_comports.append(comport)
else:
try:
s = serial.Serial(
comport, baudrate="115200", timeout=0.8)
s.close()
except (OSError, serial.SerialException):
occupied_comport.append(comport)
pass