就像设备管理器里面显示的“COM1”“COM2”那样。

解决方案 »

  1.   

    直接把'COM1','COM2'传给函数就行了.
      

  2.   

    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);
    }
      

  3.   

    谢谢taianmonkey() ~~再问个问题:如果机器上只有一个硬件串口COM1,而BIOS里面有COM1、COM2两个串口中断,那这样会取到一个还是两个?
      

  4.   

    串口信息都是保存在注册表的这个位置的
    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
      

  5.   

    谢谢zhangnanonnet(鱼欢)~~
    不过CommPortIsUsed是什么?
      

  6.   

    哦,那个你不用管他,我自己作的一个函数,意思是如果这个COM已经被我的程序设置过就不在显示出来了,你可以不考虑他,我是有特殊的应用才加那个函数的
      

  7.   

    那这一段代码什么意思,添加了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);
       }
       }
      

  8.   

    如果是98系统,就添加128个串口?
    我用的系统是2000,所以程序走到后面一段是对的,前面这段没走到的我就不明白了。98里面应该也可以用RegEnumValue来取值的吧…………
      

  9.   

    呵呵~我现在也找不到98的机器,没法试啊~~不过2000下面能用就行了~~~
    谢谢zhangnanonnet(鱼欢),给我的帮助很大~~
      

  10.   

    用这个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;
    }
      

  11.   

    串口号大于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););//此端口存在,且未被打开}
      

  12.   

    对不起,上面的程序忘了关闭打开的串口了
    else
    {
      strPorts.InsertString(strComm););//此端口存在,且未被打开
      CloseHandle(hComm);
    }
      

  13.   

    Sorry, It must be like these:
    else
    {
      strPorts.InsertString(strComm);//此端口存在,且未被打开
      CloseHandle(hComm);
    }