首页 > 代码库 > 串口注册表的自动识别
串口注册表的自动识别
Windows串口注册表的自动识别:
打开Windows注册表的方法:
在运行输入“regedit”打开注册表
struct UartInfo { DWORD UartNum; char UartName[20]; }; //获取串口列表 BOOL EnumComs(struct UartInfo **UartCom, LPDWORD UartComNumber) { //LPCTSTR 即const char * *UartComNumber = 0; const char subKey[100] = "HARDWARE\\DEVICEMAP\\SERIALCOMM"; HKEY hNewKey; LONG lResult=RegOpenKeyEx( HKEY_LOCAL_MACHINE, subKey, 0, KEY_ALL_ACCESS, &hNewKey); if(lResult != ERROR_SUCCESS) { PrintLog("打开COM注册表失败!!!"); return FALSE; } else { PrintLog("打开COM注册表成功!!!"); } //DWORD即unsigned long DWORD ValuesNumber; DWORD MaxValueNameLen; DWORD MaxValueLen; CString str; //检索指定的子键下有多少个值项 lResult = RegQueryInfoKey( hNewKey, NULL, NULL, NULL, NULL, NULL, NULL, &ValuesNumber, &MaxValueNameLen, &MaxValueLen, NULL, NULL ); if(lResult != ERROR_SUCCESS) { RegCloseKey(hNewKey); PrintLog("检索连接在PC上的串口数量失败!!!"); return FALSE; } else { str.Format("连接在PC上的串口数量是:%ld", ValuesNumber); PrintLog(str); *UartCom =(struct UartInfo *)malloc( ValuesNumber * sizeof(struct UartInfo)); } DWORD index; DWORD uartindex = 0; //CHAR ValueName[MAX_VALUE_NAME]; CHAR ValueName[100]; //DWORD ValueNameSize = MAX_VALUE_NAME; DWORD ValueNameSize; DWORD DataType; BYTE DataBuffer[100] = ""; DWORD DataLen = 100; //LPTSTR 即 char *, LPBYTE即 char * //检索每个值项,获取值名,数据类型,数据 for(index = 0; index < ValuesNumber; index++) { memset(ValueName, 0, sizeof(ValueName)); memset(DataBuffer, 0, sizeof(DataBuffer)); ValueNameSize = 100; DataLen = 100; lResult = RegEnumValue(hNewKey,index,ValueName,&ValueNameSize,NULL, &DataType, DataBuffer, &DataLen); if (lResult == ERROR_SUCCESS ) { switch(DataType) { case REG_NONE: // No value type (0) //PrintLog("DataType: REG_NONE"); break; case REG_SZ: //Unicode nul terminated string (1) //PrintLog("DataType: REG_SZ"); break; case REG_EXPAND_SZ: // Unicode nul terminated string (2) //PrintLog("DataType: REG_EXPAND_SZ"); break; case REG_BINARY: // Free form binary (3) //PrintLog("DataType: REG_BINARY"); break; case REG_DWORD: // 32-bit number (4) //PrintLog("DataType: REG_DWORD"); break; case REG_MULTI_SZ: // Multiple Unicode strings (7) //PrintLog("DataType: REG_MULTI_SZ"); break; default: //PrintLog("Other DataType!!!"); break; } #if 0 str.Format("值名:%s", ValueName); PrintLog(str); str.Format("值名长度:%ld", ValueNameSize); PrintLog(str); str.Format("数据:%s", DataBuffer); PrintLog(str); str.Format("数据长度:%ld", DataLen); PrintLog(str); #endif memcpy((*UartCom)[uartindex].UartName, DataBuffer, DataLen); (*UartCom)[uartindex].UartNum = ValuesNumber; uartindex++; } else if(lResult == ERROR_NO_MORE_ITEMS) { PrintLog("检索串口完毕!!!"); } else { DWORD dw = GetLastError(); str.Format("检索串口出错: 0x%08x", dw); PrintLog(str); return FALSE; } } *UartComNumber = uartindex; return TRUE; }
{
<span style="white-space:pre"> </span>DWORD UartComNumber = 0; struct UartInfo *pUartCom; BOOL bResult; bResult = EnumComs(&pUartCom, &UartComNumber); DWORD index; if(bResult) { PrintLog("获取串口列表成功"); } else { PrintLog("获取串口列表失败"); } for( index= 0;index < UartComNumber; index++) { pCDlg->m_ComboBox.AddString(pUartCom[index].UartName); } if(pUartCom != NULL) { free(pUartCom); pUartCom = NULL; } ResetEvent(g_UartEvent); g_UartEvent = CreateEvent( NULL, TRUE, TRUE, NULL);<span style="white-space:pre"> </span>//用于异步读写的事件句柄
}
串口注册表的自动识别
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。