snail_dongbin 发表于 2015-9-21 09:08:12

C# 如何自动连接多路串口?


询问一个已久的问题,如题,使用的usb toserial ,主芯片 FT232。
目前我已经可以用c#自动连接一类串口,方法是提前获得FT232的vip pin"0403", "6001"
这个在一类芯片中都是一样的,所以可以直接通过这个获得端口号,直接打开。
       /// <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";
            string enumerator = "FTDIBUS";
            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);

                  if (property.ToString().ToLower() != "ports") continue;//首先看看是不是串口设备(有些USB设备不是串口设备)

                  HardWareLib.SetupDiGetDeviceRegistryProperty(hDevInfo, deviceInfoData, (uint)HardWareLib.SPDRP_.SPDRP_HARDWAREID, 0, property, (uint)property.Capacity, IntPtr.Zero);

                  if (!(property.ToString().ToLower().Contains(vid.ToLower()) && property.ToString().ToLower().Contains(pid.ToLower()))) continue;//找到对应于vid&pid的设备

                  HardWareLib.SetupDiGetDeviceRegistryProperty(hDevInfo, deviceInfoData, (uint)HardWareLib.SPDRP_.SPDRP_FRIENDLYNAME, 0, property, (uint)property.Capacity, IntPtr.Zero);
                  //               break;
                }

                HardWareLib.SetupDiDestroyDeviceInfoList(hDevInfo);//记得用完释放相关内存
                string friendlyName = property.ToString();
                char[] separatorMark = { '(', ')' };
                string[] strList1 = friendlyName.Split(separatorMark);
                if (strList1.Substring(0, 3) == "COM")
                {
                  return strList1;
                }
                return null;
            }
            catch (Exception ex)
            {
                //      MessageBox.Show(ex.Message);
                return null;
            }
      }



但是如果设备中插入两个一样的设备,就没办法了,笨办法是每一个都写入特定的ID,循环读一遍。非常不方便
后来在MAC系统上得到启发,FT232可以内部修改
如图

mac系统软件只需读设备名即可,知道是什么设备 id多少。

win7设备管理器显示如图


所以如何能获取这个父类的值。那么问题就解决了。

win api 这个不是很懂

   
      public static extern uint CM_Get_Parent(out uint pdnDevInst, uint dnDevInst, uint ulFlags);

      
      public static extern uint CM_Get_Device_ID(uint dnDevInst, string Buffer, uint BufferLen, uint ulFlags);

      
      public static extern uint CM_Get_Device_ID_Size(out uint pulLen, uint dnDevInst, uint ulFlags);
搜到的不知道怎么用,请高手赐教。

dyjhy 发表于 2015-9-21 09:16:52

一个个扫不就行了

snail_dongbin 发表于 2015-9-21 22:15:35

怎么一个一个扫??具体点

codefish 发表于 2015-9-21 22:24:31

我也经常和串口打交道,不过没这样用过。学习一下。

gujiamao_love 发表于 2015-9-21 22:26:39

ft232有个库,可以识别有几个ft设备,你根据com号不就连起来了嘛?
是不是我理解错了

snail_dongbin 发表于 2015-9-22 20:58:30

我的目的很简单,相同的板子有多个,装到同一个设备中,使用usb 转com线,中间用hub转接
软件自动打开,自动连接。
由于com口在每台电脑生成都不一样,所以就导致了无法自动连接,很是不方便。每次都拔一下,看第几个消失再插上,再手动选一下{:sad:}

njjh1718 发表于 2015-12-23 15:43:38

FT232好像没这个驱动识别吧
页: [1]
查看完整版本: C# 如何自动连接多路串口?