zoukankan      html  css  js  c++  java
  • 自动获取串口端口号(C#实现)

      问题描述:串口线松动或者其他原因导致串口通信中断时,需要打开设备管理器查看端口号,然后在软件中重新选择端口号建立连接,这个过程比较麻烦。

      解决办法:使用Win32_PnPEntity WMI类来自动获取设备管理器中的串口端口号,在打开软件时,自动获取需要的端口号,打开串口建立通信连接。Win32_PnPEntity WMI类表示即插即用设备的属性,即插即用实体在控制面板的“设备管理器”中显示为条目。

      局限性:只适用于PC只有一个串口或者USB转串口的情况。如果同时有多个USB转串口或者USB串口,就没法很好地确定哪个端口号才是需要的端口号了。

      例如设备管理器中有多个USB转串口:Prolific USB-to-Serial Comm Port (COM11)

                       Prolific USB-to-Serial Comm Port (COM12)

                       Prolific USB-to-Serial Comm Port (COM13)

      本次串口通信中使用USB转串口来通信,且PC上只有一个USB转串口,实现代码如下:

     1 /// <summary>
     2 /// 自动获取串口的端口号
     3 /// </summary>
     4 /// <returns>COM号</returns>
     5 public string AutoGetCOM()
     6 {
     7     List<string> coms = new List<string>();
     8   
     9     try
    10     {
    11         //搜索设备管理器中的所有条目
    12         using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PnPEntity"))
    13         {
    14             var hardInfos = searcher.Get();
    15             foreach(var hardInfo in hardInfos)
    16             {
    17                 if (hardInfo.Properties["Name"].Value != null)
    18                 {
    19                     if (hardInfo.Properties["Name"].Value.ToString().Contains("COM"))
    20                     {
    21                         coms.Add(hardInfo.Properties["Name"].Value.ToString());
    22                     }
    23                 }
    24             }
    25             searcher.Dispose();
    26         }                                
    27         
    28     }
    29     catch 
    30     {                
    31         return null;                
    32     }
    33 
    34     string[] portNames = coms.ToArray();
    35     foreach(string portName in portNames)
    36     {
    37         if(portName.Contains("Prolific USB-to-Serial Comm Port"))
    38         {                    
    39             return portName.Substring(portName.IndexOf('(') + 1,portName.IndexOf(')') - portName.IndexOf('(') - 1);
    40         }
    41     }
    42     return null;
    43 }

      ManagementObjectSearcher类:此类是检索管理信息的常用入口点之一。 例如,它可用于枚举系统上的所有磁盘驱动器,网络适配器,进程和更多管理对象,或查询已启动的所有网络连接,暂停的服务等等。

      实现过程中遇到的异常:System.Management.ManangementException: Invalid query

      造成异常的原因是:query语句写错了

      ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from" + Win32_PnPEntity);

     注意:
        1、有时候一直找不出异常原因,可以查看一下WMI服务器是否打开了。
        2、if (hardInfo.Properties["Name"].Value != null) //操作之前先进行判空处理很有必要,不然操作空值会导致异常跑到catch处得不到自己想要的结果。
     

     

      

  • 相关阅读:
    笔记-1、线程基础、线程之间的共享和协作
    token的作用及实现原理
    mybatis+oracle如何批量执行多条update
    java程序员应该熟悉的20个有用的库(转)
    js-textarea文本换行符处理,Java后端以及js前端如何处理
    Spket,eclipse下安装Spket插件,格式化js
    关于equals变量 放在前后的问题
    @Autowired和@Qualifier共用出现提示信息Cannot find bean with qualifier XXXXX
    DOM树简单理解学习
    web.xml 中的listener、 filter、servlet 加载顺序及其详解
  • 原文地址:https://www.cnblogs.com/grebamboo/p/9993090.html
Copyright © 2011-2022 走看看