Seeking USB Serial Com Port in Windows Automatically : via PID VID
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的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- gentoo usb serial ch340 16进制读写
首先安装包含 lsusb 命令的 usbutils, emerge -v usbutils. 使用 lsusb后,可以查看到 ch340 的信息: Bus 001 Device 004: ID 1a8 ...
- usb serial for android
/******************************************************************** * usb serial for android * 说明: ...
- install usb serial
Install driver for USB-UART bridge converter on Linux Ubuntu12.04 Ubuntu下USB转串口芯片驱动程序安装,支持cp210x,pl2 ...
- 将cocos2dx+lua创建的游戏port到windows phone
在整个Port的过程中遇到的问题总结例如以下 1.一定要使用最新版本号的cocos2dx,原因大家看一下changelog就知道了,近期的cocos2dx版本号都是在修windows phone上的b ...
- 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 ...
- kill 8080 port on windows
1. 查找PID netstat -ano | findstr :yourPortNumber 2. kill进程 taskkill /PID typeyourPIDhere /F
随机推荐
- cmd 窗口的复制粘贴
如下几种方法1.点击鼠标右键,选择标志,再点击左键拖动选择要复制的内容,然后回车即可复制被 选择的内容 2.点击鼠标右键,选择标志,再点击左键拖动选择要复制的内容,然后点击鼠标右键, 此时就把选择的内 ...
- WebMethod 属性
WebMethod有以下几种属性: BufferResponse CacheDuration Description EnableSession MessageName TransactionOpti ...
- power designer中查看表sql去掉字段属性双引号设置
把Database → Edit Current DBMS → General → Script → Sql → Format → CaseSensitivityUsingQuote设置为NO
- sublime text3-代码片段配置
1.Tools->New Snippet-> <snippet> <content><![CDATA[${1:public }function ${2 ...
- PHP导出excel信息表格
//导出表格public function get_exel($fileName,$headArr,$list){//导入PHPExcel类库,因为PHPExcel没有用命名空间,只能import导入 ...
- web服务器的卸载
在卸载这三个应用之前,咱们可以在终端通过运行“dkpg -l”来查看软件状态. 方法一:选择dpkg -P来卸载软件. 因为dpkg --remove只是删除安装的文件,但不删除配置文件.而dpkg ...
- ubuntu下Qt之android环境配置以及一些常见问题解决
准备材料有: 1. qt for android 5.×版本,下载地址如下,可以选择一个合适自己机器型号的版本进行下载. 地址:http://www.qt.io/download-open-sourc ...
- iOS: 学习笔记, 用代码驱动自动布局实例
iOS自动布局是设置iOS界面的利器. 本实例展示了如何使用自动布局语言设置水平布局, 垂直布局 1. 创建空白iOS项目 2. 添加一个控制器类, 修改YYAppDelegate.m文件 #impo ...
- windows通过Composer安装yii2
1. php.ini 中;extension=php_openssl.dll(取消注释,不然在安装composer过程中会报错) 集成环境最好去php目录中打开php.ini文件,确定;extensi ...
- matlab在图片上画框
matlab在图片上画框 之前写过一个MATLAB在图片上画框的代码, http://blog.csdn.net/carson2005/article/details/17262811 最近使用后发现 ...