怎样知道机器上所有串口的名字? 就像设备管理器里面显示的“COM1”“COM2”那样。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 直接把'COM1','COM2'传给函数就行了. void GetComList(){ CString strCom; int nCom = 0; int count = 0; HANDLE hCom; do { nCom++; strCom.Format("COM%d", nCom); hCom = CreateFile(strCom, 0, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if(INVALID_HANDLE_VALUE == hCom ) break; m_cbComList.AddString(strCom); CloseHandle(hCom); } while(1);} 谢谢taianmonkey() ~~再问个问题:如果机器上只有一个硬件串口COM1,而BIOS里面有COM1、COM2两个串口中断,那这样会取到一个还是两个? 串口信息都是保存在注册表的这个位置的HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMMHKEY hKey; LONG ret; OSVERSIONINFO osvi; BOOL bOsVersionInfoEx; char keyinfo[100],comm_name[40],ValueName[40]; int i; DWORD sType,Reserved,cbData,cbValueName; hIcon=AfxGetApp()->LoadIcon(IDI_HARDWARE); SetIcon(hIcon,false); ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); memset(keyinfo,0,100); strcpy(keyinfo,"HARDWARE\\DEVICEMAP\\SERIALCOMM"); i=0; sType=REG_SZ;Reserved=0; bOsVersionInfoEx =GetVersionEx(&osvi); ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyinfo,0,KEY_ALL_ACCESS,&hKey); if (ret==ERROR_SUCCESS){ // 10-25 if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { for(i=1;i<=128;i++) { sprintf(comm_name,"COM%d",i); if (CommPortIsUsed(comm_name)==1) m_comlist.AddString(comm_name); } } else if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) { do { cbData=40;cbValueName=40; memset(comm_name,0,40); memset(ValueName,0,40); ret=RegEnumValue(hKey,i,ValueName,&cbValueName,NULL,&sType,(LPBYTE)comm_name,&cbData); if (ret==ERROR_SUCCESS) { if (CommPortIsUsed(comm_name)==1) m_comlist.AddString(comm_name); i++; } }while (ret==ERROR_SUCCESS); } } RegCloseKey(hKey);这段代码可以检索出全部的COM 谢谢zhangnanonnet(鱼欢)~~不过CommPortIsUsed是什么? 哦,那个你不用管他,我自己作的一个函数,意思是如果这个COM已经被我的程序设置过就不在显示出来了,你可以不考虑他,我是有特殊的应用才加那个函数的 那这一段代码什么意思,添加了128个串口???? if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { for(i=1;i<=128;i++) { sprintf(comm_name,"COM%d",i); if (CommPortIsUsed(comm_name)==1) m_comlist.AddString(comm_name); } } 如果是98系统,就添加128个串口?我用的系统是2000,所以程序走到后面一段是对的,前面这段没走到的我就不明白了。98里面应该也可以用RegEnumValue来取值的吧………… 呵呵~我现在也找不到98的机器,没法试啊~~不过2000下面能用就行了~~~谢谢zhangnanonnet(鱼欢),给我的帮助很大~~ 用这个API,还可以得到其他的参数!!!!!!!!//枚举机器串口个数int EnumerateCOMPort(){ int portcnt = 0; TCHAR port[MAX_PATH]; COMMCONFIG comcfg; ULONG BuffSize = sizeof(port); for (int i = 1; i< 255 ; i++) { _stprintf(port,_T("COM%d"),i); BuffSize = sizeof(port); if (GetDefaultCommConfig(port,&comcfg,&BuffSize)) portcnt ++; memset(port,0,sizeof(port)); } TRACE(_T("\nThis computer has %d COM\n"),portcnt); return portcnt;} 串口号大于9的要用\\.\COMXX来表示,所以楼上的一些方法是有局限的我用这样的一个函数就可以了CStringList strPorts;HANDLE hComm = INVALID_HANDLE_VALUE;CString strComm;for(int i=0;i<255;i++){ strComm.Format("\\\\.\\COM%d",i); hComm = CreateFile(...)//这里的参数可以查MSDN if(hComm == INVALID_HANDLE_VALUE){ DWORD dwErr = GetLastErr(); if(dwErr == 5) { strPorts.InsertString(strComm);//此端口存在,但是已被打开 }}else{ strPorts.InsertString(strComm););//此端口存在,且未被打开} 对不起,上面的程序忘了关闭打开的串口了else{ strPorts.InsertString(strComm););//此端口存在,且未被打开 CloseHandle(hComm);} Sorry, It must be like these:else{ strPorts.InsertString(strComm);//此端口存在,且未被打开 CloseHandle(hComm);} 高分!怎么样在VS2005中和VC6一样使用在类中右击增加windows消息处理 怎么滚动窗口到指定位置 VC开发者,进来就有分!!!!! 求救:创建一个activex控件,如何连接数据库? 如何将声音转化为文字 如何向另一个应用程序发送消息,使其最小化 各位都来这里一下啦!! 我想重载DoModal(),因为我要传一些值,具体怎么做,下面我写的代码有错..... 如何给单文档视图加滚动条? 播放AVI文件的问题。 关于CFileDialog如何记住上次打开的路径的问题。 求教:如何获得98系统中指定打印机的全部的可用纸型?比如枚举出:A3、A4、B5等。
{
CString strCom;
int nCom = 0;
int count = 0;
HANDLE hCom;
do {
nCom++;
strCom.Format("COM%d", nCom);
hCom = CreateFile(strCom, 0, 0, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(INVALID_HANDLE_VALUE == hCom )
break;
m_cbComList.AddString(strCom);
CloseHandle(hCom);
} while(1);
}
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMMHKEY hKey;
LONG ret;
OSVERSIONINFO osvi;
BOOL bOsVersionInfoEx;
char keyinfo[100],comm_name[40],ValueName[40];
int i;
DWORD sType,Reserved,cbData,cbValueName; hIcon=AfxGetApp()->LoadIcon(IDI_HARDWARE);
SetIcon(hIcon,false); ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
memset(keyinfo,0,100);
strcpy(keyinfo,"HARDWARE\\DEVICEMAP\\SERIALCOMM");
i=0; sType=REG_SZ;Reserved=0;
bOsVersionInfoEx =GetVersionEx(&osvi);
ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyinfo,0,KEY_ALL_ACCESS,&hKey);
if (ret==ERROR_SUCCESS){
// 10-25
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
for(i=1;i<=128;i++)
{
sprintf(comm_name,"COM%d",i);
if (CommPortIsUsed(comm_name)==1) m_comlist.AddString(comm_name);
}
}
else if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
do
{
cbData=40;cbValueName=40;
memset(comm_name,0,40);
memset(ValueName,0,40);
ret=RegEnumValue(hKey,i,ValueName,&cbValueName,NULL,&sType,(LPBYTE)comm_name,&cbData);
if (ret==ERROR_SUCCESS)
{
if (CommPortIsUsed(comm_name)==1) m_comlist.AddString(comm_name);
i++;
}
}while (ret==ERROR_SUCCESS);
}
}
RegCloseKey(hKey);
这段代码可以检索出全部的COM
不过CommPortIsUsed是什么?
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
for(i=1;i<=128;i++)
{
sprintf(comm_name,"COM%d",i);
if (CommPortIsUsed(comm_name)==1) m_comlist.AddString(comm_name);
}
}
我用的系统是2000,所以程序走到后面一段是对的,前面这段没走到的我就不明白了。98里面应该也可以用RegEnumValue来取值的吧…………
谢谢zhangnanonnet(鱼欢),给我的帮助很大~~
//枚举机器串口个数
int EnumerateCOMPort()
{
int portcnt = 0;
TCHAR port[MAX_PATH];
COMMCONFIG comcfg;
ULONG BuffSize = sizeof(port); for (int i = 1; i< 255 ; i++)
{
_stprintf(port,_T("COM%d"),i);
BuffSize = sizeof(port);
if (GetDefaultCommConfig(port,&comcfg,&BuffSize))
portcnt ++;
memset(port,0,sizeof(port));
}
TRACE(_T("\nThis computer has %d COM\n"),portcnt);
return portcnt;
}
我用这样的一个函数就可以了
CStringList strPorts;
HANDLE hComm = INVALID_HANDLE_VALUE;
CString strComm;
for(int i=0;i<255;i++)
{
strComm.Format("\\\\.\\COM%d",i);
hComm = CreateFile(...)//这里的参数可以查MSDN
if(hComm == INVALID_HANDLE_VALUE)
{
DWORD dwErr = GetLastErr();
if(dwErr == 5)
{
strPorts.InsertString(strComm);//此端口存在,但是已被打开
}
}
else
{
strPorts.InsertString(strComm););//此端口存在,且未被打开}
else
{
strPorts.InsertString(strComm););//此端口存在,且未被打开
CloseHandle(hComm);
}
else
{
strPorts.InsertString(strComm);//此端口存在,且未被打开
CloseHandle(hComm);
}