搜索
bottom↓
回复: 15

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

[复制链接]

出0入0汤圆

发表于 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口呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-9-19 12:34:24 | 显示全部楼层
为什么要遍历所有呢?查找注_册表看看系统当前有几个串口,只需要查询这几个就可以了

出0入0汤圆

发表于 2010-9-19 12:39:01 | 显示全部楼层
c#

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

出0入0汤圆

发表于 2010-9-19 13:36:32 | 显示全部楼层
回复【楼主位】figoxwm
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2010-9-19 22:18:55 | 显示全部楼层
看了1楼回复,问了一下古哥,说是在这里可以找到:HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM

出0入0汤圆

发表于 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[25]={0};
        UCHAR szPortName[25]={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[MAX_PATH] = "";  // 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] = '\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;
       

}

出0入0汤圆

发表于 2010-10-23 11:07:07 | 显示全部楼层
刚好用到 谢谢

出0入0汤圆

发表于 2010-10-23 11:51:30 | 显示全部楼层
瞧瞧

出0入0汤圆

发表于 2010-10-23 13:09:41 | 显示全部楼层
www.naughter.com/enumser.html

出0入0汤圆

发表于 2010-10-23 18:23:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-23 11:53:14 | 显示全部楼层
用了,很好

出0入0汤圆

发表于 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);
            }

出0入134汤圆

发表于 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);
}

出0入0汤圆

发表于 2010-11-23 12:29:57 | 显示全部楼层
最近一直在搞这方面的,先mark

出0入0汤圆

发表于 2010-11-23 14:18:15 | 显示全部楼层
给你传个用过的串口遍历程序,很好用,一个外国人写的。
串口遍历程序ourdev_599884QA2J9M.zip(文件大小:6K) (原文件名:EnumSerial.zip)

出0入0汤圆

发表于 2011-1-8 11:54:44 | 显示全部楼层
刚好用到。太给力了。哈哈。感谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-16 04:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表