figoxwm 发表于 2010-9-19 12:06:27

上位机如何实现遍历所有串口?

因为USB转串口虚拟出来的com可能不是固定的一个COM,有时是COM5,有时是COM6...COM10等,现在上位机打算遍历每个COM发一些指令,有返回所需要的指令则判定此串口为正解的串口,现在问题是如果是不存在的COM口,则会出错
用的是MSCOMM控件
m_Comm.SetCommPort(change_com);//选择要遍历的COM,此函数如果电脑上没有此COM,则会出错
m_Comm.SetInBufferSize(1024);//设置输入缓冲区的大小,单位为Byte
m_Comm.SetOutBufferSize(512);//设置输出缓冲区的大小,单位为Byte
if(!m_Comm.GetPortOpen())//打开串口
m_Comm.SetPortOpen(TRUE);
m_Comm.SetInputMode(1);
m_Comm.SetSettings("38400,n,8,1");
m_Comm.SetRThreshold(1);
m_Comm.SetInputLen(0);       

这里!!m_Comm.SetCommPort(change_com);//选择要遍历的COM,此函数如果电脑上没有此COM,则会出错
比如电脑上没有COM6这口,但程序里要遍历1-10的COM口,此时m_Comm.SetCommPort(6);,这时会出错了,
不知MSCOMM控件有没有办法能得到假如没有此COM口,所返回数据,我能判断出没COM口,则我直接遍历下一个COM口呢?

little_Monkey 发表于 2010-9-19 12:34:24

为什么要遍历所有呢?查找注_册表看看系统当前有几个串口,只需要查询这几个就可以了

STM8L103 发表于 2010-9-19 12:39:01

c#

                        string[] com_array = System.IO.Ports.SerialPort.GetPortNames();

ylp1332 发表于 2010-9-19 13:36:32

回复【楼主位】figoxwm
-----------------------------------------------------------------------

for (int i = 0; i < 256; i++)
{
// 在这里尝试打开串口
CreateFile(...)
}

AIHHLI 发表于 2010-9-19 22:18:55

看了1楼回复,问了一下古哥,说是在这里可以找到:HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM

rlogin 发表于 2010-9-19 23:21:35

int CCONTROLDlg::EnumComport()
{
        unsigned int i;      
        HKEY hKey;
        LPCTSTR data_Set="HARDWARE\\DEVICEMAP\\SERIALCOMM\\";
        long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKey));
        if(ret0 != ERROR_SUCCESS){return -1;}

        CHAR Name={0};
        UCHAR szPortName={0};
        LONG Status={0};
    DWORD dwIndex=0;
    DWORD dwName={0};
    DWORD dwSizeofPortName=sizeof(szPortName);
    DWORD Type={0};
    dwName = sizeof(Name);
    dwSizeofPortName = sizeof(szPortName);

    CHAR   achClass = "";// buffer for class name
    DWORD    cchClassName = MAX_PATH;// length of class string
    DWORD    cSubKeys;               // number of subkeys
    DWORD    cbMaxSubKey;            // longest subkey size
    DWORD    cchMaxClass;            // longest class string
    DWORD    cValues;            // number of values for key
    DWORD    cchMaxValue;          // longest value name
    DWORD    cbMaxValueData;       // longest value data
    DWORD    cbSecurityDescriptor; // size of security descriptor
    FILETIME ftLastWriteTime;      // last write time

        RegQueryInfoKey(hKey,      // key handle
      achClass,                // buffer for class name
      &cchClassName,         // length of class string
      NULL,                  // reserved
      &cSubKeys,               // number of subkeys
      &cbMaxSubKey,            // longest subkey size
      &cchMaxClass,            // longest class string
      &cValues,                // number of values for this key
      &cchMaxValue,            // longest value name
      &cbMaxValueData,         // longest value data
      &cbSecurityDescriptor,   // security descriptor
      &ftLastWriteTime);       // last write time

    for(i=0;i<cValues;i++)
    {
                Name = '\0';;
                dwName = 25;
                Status = RegEnumValue (hKey,
                                                i,
                                                Name,
                                                &dwName,
                                                NULL,
                                    &Type,
                                                szPortName,
               &dwSizeofPortName );               
                if((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA))
                {
                        m_Port.AddString(CString(szPortName));
                }
        }
        RegCloseKey(hKey);
       
        int nCount = m_Port.GetCount();
        if (nCount > 0)
                m_Port.SetCurSel(0);

        return i;
       

}

orange2348 发表于 2010-10-23 11:07:07

刚好用到 谢谢

QQ373466062 发表于 2010-10-23 11:51:30

瞧瞧

theophilus 发表于 2010-10-23 13:09:41

www.naughter.com/enumser.html

cuikai12345 发表于 2010-10-23 18:23:08

mark

xiaosars 发表于 2010-11-23 11:53:14

用了,很好

yajira 发表于 2010-11-23 12:06:36

C#

            RegistryKey RootKey = Registry.LocalMachine;
            RegistryKey Comkey = RootKey.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM");

            String[] ComNames = Comkey.GetValueNames();

            foreach ( String ComNamekey in ComNames)
            {
                string TemS = Comkey.GetValue(ComNamekey).ToString();
                ComName.Items.Add(TemS);
            }

elecfun 发表于 2010-11-23 12:19:56

C#
try {
    foreach (string com in System.IO.Ports.SerialPort.GetPortNames())//自动获取串行口名称
      this.cmb_COM.Items.Add(com);
    this.cmb_COM.SelectedIndex = 0;
   }
catch {
    MessageBox.Show("没有发现串口!", this.Text);
}

chinawrj 发表于 2010-11-23 12:29:57

最近一直在搞这方面的,先mark

falcon_z 发表于 2010-11-23 14:18:15

给你传个用过的串口遍历程序,很好用,一个外国人写的。
串口遍历程序ourdev_599884QA2J9M.zip(文件大小:6K) (原文件名:EnumSerial.zip)

ybs777 发表于 2011-1-8 11:54:44

刚好用到。太给力了。哈哈。感谢
页: [1]
查看完整版本: 上位机如何实现遍历所有串口?