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);
搜到的不知道怎么用,请高手赐教。 一个个扫不就行了 怎么一个一个扫??具体点 我也经常和串口打交道,不过没这样用过。学习一下。 ft232有个库,可以识别有几个ft设备,你根据com号不就连起来了嘛?
是不是我理解错了 我的目的很简单,相同的板子有多个,装到同一个设备中,使用usb 转com线,中间用hub转接
软件自动打开,自动连接。
由于com口在每台电脑生成都不一样,所以就导致了无法自动连接,很是不方便。每次都拔一下,看第几个消失再插上,再手动选一下{:sad:}
FT232好像没这个驱动识别吧
页:
[1]