自动获取串口号
场景:自动获取串口号?该如何解决
自动获取串口号?
编写了一个串口通信的软件,当时参照“串口调试助手”的源码编写的,后来出了两个问题:
1、我偷懒调用了“串口调试助手”串口通信部分的封装类,最开始只用com1 和com2是没什么太大问题,后来由于硬件的需要,装了一个usb转串口的东西,安装以后扩展出来的串口自动识别成com10,或com11,或com12,我就直接在串口号的控件里加入了这几个串口号,可是一运行就说找不到串口或打不开(在设备管理器中我已经把当前使用的串口号改为我要用的了)。但是改成com7,或com8,或com9也就是
com10以下的都能用,我就很奇怪是不是软件里的设置有什么问题?
2、这个usb转串口的东西在不同的电脑上驱动,会扩展成不同的串口号,就是在一台电脑的不同usb口驱动都会显示为不同的串口编号,我想知道有什么方法可以让我在软件里直接获取出当前活动的串口号?
------解决方案--------------------
1.串口号大于9必须使用诸如\\.\COM10的形式
2.可以通过查询注册表的方式得到。代码如下:
int GetSerialPort(CStringArray& arrCom)
{
arrCom.RemoveAll();
HKEY hkey;
LONG lRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T( "HARDWARE\\DEVICEMAP\\SERIALCOMM "), NULL, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_READ, &hkey);
if (lRes == ERROR_SUCCESS)
{
TCHAR tchKey[MAX_PATH];
TCHAR tchValue[20];
DWORD dwIndex = 0;
DWORD dwType = REG_SZ;
while(lRes == ERROR_SUCCESS)
{
DWORD dwCount = MAX_PATH;
DWORD dwVCount = 20;
lRes = RegEnumValue(hkey, dwIndex++, tchKey, &dwCount, NULL, &dwType, (LPBYTE)tchValue, &dwVCount);
if(lRes == ERROR_SUCCESS)
{
if((dwVCount > 0) && (dwCount > 0))
{
arrCom.Add(tchValue);
}
}
}
}
RegCloseKey(hkey);
return arrCom.GetSize();
}
代码不是我写的,不敢保证是正确的
自动获取串口号?
编写了一个串口通信的软件,当时参照“串口调试助手”的源码编写的,后来出了两个问题:
1、我偷懒调用了“串口调试助手”串口通信部分的封装类,最开始只用com1 和com2是没什么太大问题,后来由于硬件的需要,装了一个usb转串口的东西,安装以后扩展出来的串口自动识别成com10,或com11,或com12,我就直接在串口号的控件里加入了这几个串口号,可是一运行就说找不到串口或打不开(在设备管理器中我已经把当前使用的串口号改为我要用的了)。但是改成com7,或com8,或com9也就是
com10以下的都能用,我就很奇怪是不是软件里的设置有什么问题?
2、这个usb转串口的东西在不同的电脑上驱动,会扩展成不同的串口号,就是在一台电脑的不同usb口驱动都会显示为不同的串口编号,我想知道有什么方法可以让我在软件里直接获取出当前活动的串口号?
------解决方案--------------------
1.串口号大于9必须使用诸如\\.\COM10的形式
2.可以通过查询注册表的方式得到。代码如下:
int GetSerialPort(CStringArray& arrCom)
{
arrCom.RemoveAll();
HKEY hkey;
LONG lRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T( "HARDWARE\\DEVICEMAP\\SERIALCOMM "), NULL, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_READ, &hkey);
if (lRes == ERROR_SUCCESS)
{
TCHAR tchKey[MAX_PATH];
TCHAR tchValue[20];
DWORD dwIndex = 0;
DWORD dwType = REG_SZ;
while(lRes == ERROR_SUCCESS)
{
DWORD dwCount = MAX_PATH;
DWORD dwVCount = 20;
lRes = RegEnumValue(hkey, dwIndex++, tchKey, &dwCount, NULL, &dwType, (LPBYTE)tchValue, &dwVCount);
if(lRes == ERROR_SUCCESS)
{
if((dwVCount > 0) && (dwCount > 0))
{
arrCom.Add(tchValue);
}
}
}
}
RegCloseKey(hkey);
return arrCom.GetSize();
}
代码不是我写的,不敢保证是正确的