python–禁用、启用串口设备
最近的项目,由于通讯数据量较大,将会尝试高速的传输(1MBps),决定采用单片机的USB虚拟串口。并不是用的CH340之类的转换芯片,而是用的MCU的USB接口与电脑相连。
在调试的过程中,由于要不断的复位和上电,电脑上的串口就总是处于不可用的状态,必须将端口禁用,再启用,才能正常工作。而MCU一旦复位,电脑上又得重来一遍。所以就想着将这个动作集成到我的上位机软件中。
获得设备ID
手动获取可以通过设备管理器,在相应设备上右击,设备属性–详细信息–设备实例路径,USB\VID开头的一整串字符就是ID了。
自动获取的代码如下:
def get_dev_id(dev="COM1"):
wmi = win32com.client.GetObject("winmgmts:")
for usb in wmi.InstancesOf("Win32_SerialPort"):
if True:
if usb.DeviceID == dev:
print("\r\n设备信息:", usb.DeviceID, usb.Name, usb.PNPDeviceID)
return usb.PNPDeviceID
return None
禁用和启用设备
这个简单,调用pnputil即可,以管理员方式运行CMD,并运行
pnputil /disable-device “USB\VID_0483&PID_5740\3251386A3038”
pnputil /enable-device “USB\VID_0483&PID_5740\3251386A3038”
os.system("pnputil /disable-device \"USB\\VID_0483&PID_5740\\3251386A3038\"")
os.system("pnputil /enable-device \"USB\VID_0483&PID_5740\\3251386A3038\"")
获取管理员权限
集成到python中时,就需要先获取管理员权限,
ctypes.windll.shell32.IsUserAnAdmin()
完整代码如下
import ctypes
import os
import win32com.client
# 获取串口的ID
def get_dev_id(dev="COM1"):
wmi = win32com.client.GetObject("winmgmts:")
for usb in wmi.InstancesOf("Win32_SerialPort"):
if True:
if usb.DeviceID == dev:
print("\r\n设备信息:", usb.DeviceID, usb.Name, usb.PNPDeviceID)
return usb.PNPDeviceID
return None
def is_admin(id=""):
if ctypes.windll.shell32.IsUserAnAdmin(): # 获取管理员权限
print("以管理员权限运行")
# USB\VIDxxxxxxxxxxxxx,设备管理器中--设备属性--详细信息--设备实例路径
# 需要注意特殊字符要用\标注
str = "pnputil /disable-device \"" + id + "\""
os.system(str) # 禁用设备
str = "pnputil /enable-device \"" + id + "\""
os.system(str) # 使能设备
else:
print("无管理员权限")
if __name__ == "__main__":
# run1 = os.system("pnputil /disable-device \"USB\\VID_0483&PID_5740\\3251386A3038\"")
# run1 = os.system("pnputil /enable-device \"USB\VID_0483&PID_5740\\3251386A3038\"")
com_id = get_dev_id("COM98") # 串口号,见设备管理器
is_admin(com_id)