python 实现Windows下COM端口的软停用和启用

#在测试中会碰到某些设备的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 版权协议,转载请附上原文出处链接和本声明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kamach_83

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值