#在测试中会碰到某些设备的COM端口会宕机或者乱码,给后面的测试带来困扰,如果通过程式自动修复COM口,给开发和使用带来更灵活智能的体验。#
所以本文就来试着用python来实现软修复,执行停用和启用COM端口。
一、主要用到两个库:ctypes,win32com
1.ctypes详细用法 可以参考官方文档:ctypes --- Python 的外部函数库 — Python 3.12.4 文档
2.win32com是Python的一个扩展模块,提供了与Windows系统中COM组件进行交互的功能。通过win32com,我们可以在Python中创建COM对象、调用COM对象的方法、获取和设置COM对象的属性等。
二、通常是在windows下进行停用启用COM,但是要通过python去实现停用启用,关键是能够获取到COM端口的设备实例路径,如下是通过Windows手动查询步骤和结果,红色编号6就是实际结果,也是python编程需要的关键信息:
三、python获取设备实例路径的代码如下:
def get_dev_id(dev="COM2"): wmi = GetObject("winmgmts:") print(wmi.InstancesOf("win32_SerialPort")) for COM in wmi.InstancesOf("Win32_SerialPort"): print(COM.DeviceID,COM.Name,COM.PNPDeviceID) if True: if COM.DeviceID == dev: print("\r\n设备信息:", COM.DeviceID, COM.Name, COM.PNPDeviceID) return COM.PNPDeviceID return None
代码运行结果如下:
四、以管理员权限执行停用和启用的动作,功能代码如下:
def is_admin(com_port_id): if ctypes.windll.shell32.IsUserAnAdmin(): # 获取管理员权限 print("以管理员权限运行") # USB\VIDxxxxxxxxxxxxx,设备管理器中--设备属性--详细信息--设备实例路径 # 需要注意特殊字符要用\标注 Dstr = "pnputil /disable-device \"" + com_port_id + "\"" os.system(Dstr) # 禁用设备 time.sleep(5) Estr = "pnputil /enable-device \"" + com_port_id + "\"" os.system(Estr) # 使能设备 else: print("无管理员权限")
若当前登入系统的账户有系统管理员权限则可以正常实现停用启用的动作,若无管理员权限则不饿能实现,需要先提升账户权限。
五、附上完整的代码给大家参考一下:
import ctypes import os import time from win32com.client import GetObject # 获取串口的ID def get_dev_id(dev="COM2"): wmi = GetObject("winmgmts:") print(wmi) print(wmi.InstancesOf("win32_SerialPort")) for COM in wmi.InstancesOf("Win32_SerialPort"): print(COM.DeviceID,COM.Name,COM.PNPDeviceID) if True: if COM.DeviceID == dev: print("\r\n设备信息:", COM.DeviceID, COM.Name, COM.PNPDeviceID) return COM.PNPDeviceID return None def is_admin(com_port_id): if ctypes.windll.shell32.IsUserAnAdmin(): # 获取管理员权限 print("以管理员权限运行") # USB\VIDxxxxxxxxxxxxx,设备管理器中--设备属性--详细信息--设备实例路径 # 需要注意特殊字符要用\标注 Dstr = "pnputil /disable-device \"" + com_port_id + "\"" os.system(Dstr) # 禁用设备 time.sleep(5) Estr = "pnputil /enable-device \"" + com_port_id + "\"" os.system(Estr) # 使能设备 else: print("无管理员权限") if __name__ == "__main__": com_id = get_dev_id("COM2") # 串口号,见设备管理器 is_admin(com_i
本文使用环境为:Windows 10 ,python 3.10
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。