通过串口设备vid,pid自动获得该设备所对应的串口号

本文介绍了如何使用C#自动获取目标机器上特定串口设备的串口号,以实现串口通讯的自动化,避免用户手动选择。通过结合Serial Port控件和正则表达式,解决了RecievedBytesThreshold设置问题,提高了软件与设备连接的用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       用C#做串口通讯很方便,因为dotfx2.0已经集成了Serial Port控件,此控件使用上比MSComm控件更简单,当然它也有一个小bug(RecievedBytesThreshold设置有时候不好使),但是这个问题很好解决,而做串口通讯最最基本的问题就是如何获得目标机器的要与之通讯的特定设备的特定com号,有许多软件在处理这个问题的时候都是要求用户手动去选择对应的串口号,这多少有些不人性化,这篇文章就是介绍如何自动获得目标机器对应特定串口设备的串口号,从而达到软件与目标设备的自动通讯。
  方法基本上是我前一篇文章的一个应用,代码如下(注意自己添加引用的命名空间)

         /// <summary>
        
/// 通过vid,pid获得串口设备号
        
/// </summary>
        
/// <param name="vid">vid</param>
        
/// <param name="pid">pid</param>
        
/// <returns>串口号</returns>

         public   static   string  GetPortNameFormVidPid( string  vid,  string  pid)
        
{
            Guid myGUID 
= Guid.Empty;
            
string enumerator = "USB";
            
try
            
{
                IntPtr hDevInfo 
= HardWareLib.SetupDiGetClassDevs(ref myGUID, enumerator, IntPtr.Zero, HardWareLib.DIGCF_ALLCLASSES | HardWareLib.DIGCF_PRESENT);
                
if (hDevInfo.ToInt32() == HardWareLib.INVALID_HANDLE_VALUE)
                
{
                    
throw new Exception("没有该类设备");
                }

                HardWareLib.SP_DEVINFO_DATA deviceInfoData;
//想避免在api中使用ref,就把structure映射成类
                deviceInfoData = new HardWareLib.SP_DEVINFO_DATA();
                deviceInfoData.cbSize 
= 28;//如果要使用SP_DEVINFO_DATA,一定要给该项赋值28=16+4+4+4
                deviceInfoData.devInst = 0;
                deviceInfoData.classGuid 
= System.Guid.Empty;
                deviceInfoData.reserved 
= 0;
                UInt32 i;
                StringBuilder property 
= new StringBuilder(HardWareLib.MAX_DEV_LEN);
                
for (i = 0; HardWareLib.SetupDiEnumDeviceInfo(hDevInfo, i, deviceInfoData); i++)
                
{
                    
//       Console.Write(deviceInfoData.classGuid.ToString());
                    
//       HardWareOperation.SetupDiGetDeviceInstanceId(hDevInfo, deviceInfoData, porperty, (uint)porperty.Capacity, 0);
                    HardWareLib.SetupDiGetDeviceRegistryProperty(hDevInfo, deviceInfoData,
                        (
uint)HardWareLib.SPDRP_.SPDRP_CLASS,
                        
0, property, (uint)property.Capacity, IntPtr.Zero);
                   
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值