After you read previous article, you might know how to operate a com port in Windows.



   But that example requires programmer (or user, if you modified that example being able to support inputting command line) to set a com port number, it is not consummate. I will fill the flaw in here.





You need to check the device enumeration path zeroth.In here, I use CH340 (USB com port chip from China), I assure there is only one CH340 connected to the computer, I could seek the comport via pid(product id) and vid (vendor
id).

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzYwNjE3MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

If you do not know what is vid/pid : Briefly say, it is USB device firmware replying computer what device it is in seral number. We could use pid/vid + google to indentify the device, even there is no correspending driver.







 You need to set hSerial as invalid in the begining of that code:

hSerial = INVALID_HANDLE_VALUE;

And you should replace that as the code below:

 hSerial = CreateFile(&comPortName[0], GENERIC_READ|GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );

as

 if(0 == strncmp(&comPortName[0], "\\\\.\\COM0", MAX_STR_LEN))
{
unsigned int i; COMMCONFIG comConfig;
DWORD dwSize;
dwSize = sizeof(comConfig); ZeroMemory(&comConfig, sizeof(COMMCONFIG)); for(i = 1; i< 256; i++){
TCHAR comName[16]; sprintf(&comName[0], "COM%d", i); if(FALSE != GetDefaultCommConfig(&comName[0], &comConfig, &dwSize))
printf("found %s\n", &comName[0]);
}/*for */ } if(0 == strncmp(&comPortName[0], "\\\\.\\COM0", MAX_STR_LEN))
{
DWORD dwGuids;
GUID *pGuids; HDEVINFO hDevInfo;
SP_DEVICE_INTERFACE_DATA devInterfaceData;
SP_DEVINFO_DATA devInfoData;
unsigned int index; dwGuids = 0; isSuc = SetupDiClassGuidsFromName("Ports", NULL, 0, &dwGuids); pGuids = (GUID*)malloc(dwGuids*sizeof(GUID));
ZeroMemory(pGuids, dwGuids*sizeof(GUID));
isSuc = SetupDiClassGuidsFromName("Ports", pGuids, dwGuids, &dwGuids); hDevInfo = SetupDiGetClassDevs(pGuids, NULL, NULL,
/*DIGCF_ALLCLASSES | DIGCF_PRESENT |*/ DIGCF_DEVICEINTERFACE); index = 0; ZeroMemory(&devInfoData, sizeof(SP_DEVINFO_DATA));
devInfoData.cbSize = sizeof(SP_DEVINFO_DATA); while(SetupDiEnumDeviceInfo(hDevInfo, index, &devInfoData))
{ TCHAR szDeviceInstanceID[1024]; index++; isSuc = CM_Get_Device_ID(devInfoData.DevInst,
&szDeviceInstanceID[0] , sizeof(szDeviceInstanceID), 0); //printf("%s\n", &szDeviceInstanceID[0]); if(0 == strncmp(&szDeviceInstanceID[0], "USB\\VID_1A86&PID_7523",
strlen("USB\\VID_1A86&PID_7523")) )
{ DWORD requiredSize;
GUID classGuid; SP_DEVICE_INTERFACE_DATA devInterfaceData;
SP_DEVICE_INTERFACE_DETAIL_DATA *pDevInterfaceDetailData; printf("&szDeviceInstanceID[0] = %s\n", &szDeviceInstanceID[0]); ZeroMemory(&devInterfaceData, sizeof(SP_DEVICE_INTERFACE_DATA)); devInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
classGuid = devInfoData.ClassGuid; isSuc = SetupDiEnumDeviceInterfaces(hDevInfo, &devInfoData, pGuids,
0, &devInterfaceData); isSuc = SetupDiGetDeviceInterfaceDetail(hDevInfo,
&devInterfaceData, NULL, NULL, &requiredSize, NULL); //printf ("%s\n", GetLastErrorMessage( GetLastError() ) ); pDevInterfaceDetailData = (SP_INTERFACE_DEVICE_DETAIL_DATA*)malloc(requiredSize); pDevInterfaceDetailData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); isSuc = SetupDiGetDeviceInterfaceDetail( hDevInfo,
&devInterfaceData, pDevInterfaceDetailData, requiredSize,
&requiredSize, &devInfoData); printf("devInterfaceDetailData.DevicePath = %s\n",
pDevInterfaceDetailData->DevicePath); hSerial = CreateFile(pDevInterfaceDetailData->DevicePath,
GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL ); free(pDevInterfaceDetailData); pDevInterfaceDetailData = NULL; if(INVALID_HANDLE_VALUE != hSerial)
break;
}
} free(pGuids); pGuids = NULL;
SetupDiDestroyDeviceInfoList(hDevInfo); if(INVALID_HANDLE_VALUE == hSerial)
{
printf("auto seeking com number fail!!\n");
return 0;
}
}
else /*non auto seeking com port*/
{
hSerial = CreateFile(&comPortName[0], GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
}/*if auto seeking com port*/

("\\\\.\\COM0" be  auto-seeking mode in here.)

blogID=6543025294777699729" target="_blank" style="clear:right; margin-bottom:1em; margin-left:1em; float:right">

You have to modify the USB\\VID_1A86&PID_7523 as your device's.



( If you use FTDI's FT232B  or FT232R, that should be



FTDIBUS\\VID_0403+PID_6001







)









That would support auto-seeking com-port.



Note the line :

        while(SetupDiEnumDeviceInfo(hDevInfo, index, &devInfoData))

You would find NOT ONLY one device as VID_1A86&PID_7523, even you have plugged only one CH340. If you print that seeking result (it is just the line : printf("&szDeviceInstanceID[0] = %s\n", &szDeviceInstanceID[0]);), you would watch the printing as:



blogID=6543025294777699729" target="_blank" style="clear:left; margin-right:1em; margin-bottom:1em; float:left">

blogID=6543025294777699729" target="_blank" style="clear:left; margin-right:1em; margin-bottom:1em; float:left">

&szDeviceInstanceID[0] = USB\VID_1A86&PID_7523\6&123E8975&0&1
devInterfaceDetailData.DevicePath = \\?\usb#vid_1a86&pid_7523#6&123e8975&0&1#{4d
36e978-e325-11ce-bfc1-08002be10318}
&szDeviceInstanceID[0] = USB\VID_1A86&PID_7523\6&123E8975&0&2
devInterfaceDetailData.DevicePath = \\? \usb#vid_1a86&pid_7523#6&123e8975&0&2#{4d
36e978-e325-11ce-bfc1-08002be10318}
&szDeviceInstanceID[0] = USB\VID_1A86&PID_7523\6&123E8975&0&3
devInterfaceDetailData.DevicePath = \\? \usb#vid_1a86&pid_7523#6&123e8975&0&3#{4d
36e978-e325-11ce-bfc1-08002be10318}
&szDeviceInstanceID[0] = USB\VID_1A86&PID_7523\6&123E8975&0&4
devInterfaceDetailData.DevicePath = \\? \usb#vid_1a86&pid_7523#6&123e8975&0&4#{4d
36e978-e325-11ce-bfc1-08002be10318}
&szDeviceInstanceID[0] = USB\VID_1A86&PID_7523\6&123E8975&0&5
devInterfaceDetailData.DevicePath = \\?\usb#vid_1a86&pid_7523#6&123e8975&0&5#{4d
36e978-e325-11ce-bfc1-08002be10318}
&szDeviceInstanceID[0] = USB\VID_1A86&PID_7523\7&107B0B49&0&2
devInterfaceDetailData.DevicePath = \\?\usb#vid_1a86&pid_7523#7&107b0b49&0&2#{4d
36e978-e325-11ce-bfc1-08002be10318}
&szDeviceInstanceID[0] = USB\VID_1A86&PID_7523\7&14F85601&0&1
devInterfaceDetailData.DevicePath = \\?\usb#vid_1a86&pid_7523#7&14f85601&0&1#{4d
36e978-e325-11ce-bfc1-08002be10318}

I do not know why Windows lists so much device path. AlI I could do, is to try opening each. you could find that the actual one's last 4 characters (like &0&4, &0&2..etc) would change with port number, that depends on which
USB socket you plug.



Seeking USB Serial Com Port in Windows Automatically : via PID VID的更多相关文章

  1. Linux/drivers/usb/serial/ftdi_sio.c

    Linux/drivers/usb/serial/ftdi_sio.h /* 2 * Driver definitions for the FTDI USB Single Port Serial Co ...

  2. Methods Collection of Enumerating Com Port in Windows, by C

    According to this stack overflow thread, PJ Naughter has implemented 9 methods to emunerate com port ...

  3. UEFI Bootable USB Flash Drive - Create in Windows(WIN7 WIN8)

    How to Create a Bootable UEFI USB Flash Drive for Installing Windows 7, Windows 8, or Windows 8.1 In ...

  4. gentoo usb serial ch340 16进制读写

    首先安装包含 lsusb 命令的 usbutils, emerge -v usbutils. 使用 lsusb后,可以查看到 ch340 的信息: Bus 001 Device 004: ID 1a8 ...

  5. usb serial for android

    /******************************************************************** * usb serial for android * 说明: ...

  6. install usb serial

    Install driver for USB-UART bridge converter on Linux Ubuntu12.04 Ubuntu下USB转串口芯片驱动程序安装,支持cp210x,pl2 ...

  7. 将cocos2dx+lua创建的游戏port到windows phone

    在整个Port的过程中遇到的问题总结例如以下 1.一定要使用最新版本号的cocos2dx,原因大家看一下changelog就知道了,近期的cocos2dx版本号都是在修windows phone上的b ...

  8. Serial Fluent UDF on Windows

    test test Table of Contents 1. Serial UDF on Windows OS 1 Serial UDF on Windows OS Note: Udf has to ...

  9. kill 8080 port on windows

    1. 查找PID netstat -ano | findstr :yourPortNumber 2. kill进程 taskkill /PID typeyourPIDhere /F

随机推荐

  1. JavaScript Ajax + Promise

    AJAX 在现代浏览器上写AJAX主要依靠XMLHttpRequest对象: function success(text) { var textarea = document.getElementBy ...

  2. POJ 3041 Asteroids 最小点覆盖 == 二分图的最大匹配

    Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape o ...

  3. 学习Swift -- 析构过程

    析构过程 析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用.析构器用关键字deinit来标示,类似于构造器要用init来标示. 原理 Swift 会自动释放不再需要的实例以释放资源, ...

  4. Codeforces Round #Pi (Div. 2)

    上次比完赛就准备写了, 结果懒癌发作了, 拖到了现在. Problem_A: 题意: 在一条x轴上有n座城市, 每个城市之间的距离就是它们对应坐标的距离, 现在求出每个城市到其他城市的最近距离和最远距 ...

  5. bootstrap datepicker时间插件显示位置不对

    bppystrap-datetimepicker.min.js中,修改如下:将原来的        if(!b(this.element)){l=l+document.body.scrollTop}改 ...

  6. Java语言基础(四) String和StringBuffer的区别

    Java提供了两个字符串类:String和StringBuffer. String提供了数值不可变的字符串,而StringBuffer提供的字符串对象可以进行修改. 当知道字符数据要改变的时候就可以使 ...

  7. Eclipse的设置小细节提高开发效率

    1. 自动联想功能增强 preference->java->Editor->Content Assist中, Auto activation triggers for java中默认 ...

  8. windows驱动开发推荐书籍

    [作者] 猪头三 个人网站 :http://www.x86asm.com/ [序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都 ...

  9. -_-#【邮件】qq邮箱不显示图片

    干货分享之邮件营销QQ邮箱IP白名单服务申请

  10. Windows Azure云服务价格调整通知

     好消息!由世纪互联运营的 Windows Azure推出优惠啦.我们采纳了多渠道客户的意见和建议,为了更好地服务大家,将降低多种云服务的价格,其中包括我们最受欢迎的服务 -虚拟机和 Block ...