搜索
bottom↓
回复: 9

智能充电器上位机问题请教: 自动识别电脑上已经有的串口怎么做?[已经解决]

[复制链接]

出0入0汤圆

发表于 2009-12-10 14:18:14 | 显示全部楼层 |阅读模式
参考了坛子里面一个朋友的毕业设计的串口调试这块程序.

现在在改进过程中请教这么个问题:

怎么才能自动识别电脑上已经有的串口端口?  VS2008 中 SerialPort 控件.


(原文件名:1.jpg)

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-12-10 15:22:34 | 显示全部楼层
不懂,帮顶

出0入4汤圆

发表于 2009-12-10 15:32:31 | 显示全部楼层
用Delphi的话,只需要Cport控件,它帮你全搞定。

出0入0汤圆

 楼主| 发表于 2009-12-10 15:41:09 | 显示全部楼层
恩, 那我再想想办法.

我本来以为是扫描下, 每个串口都尝试下打开, 如果能打开的那就列出来.

不过后来想想这样做法不是很正确.

出0入4汤圆

发表于 2009-12-10 16:24:34 | 显示全部楼层
我是查找注册表的

/* -------- 从注册表里搜寻安装的串口 -----------------------
FindCommPort() : 查找电脑上的串口名字, 把串口名字写入一个ComboBox控件里
传入: pComboBox  CComboBox控件的指针
  */
void FindCommPort( CComboBox *pComboBox )
{
        HKEY hKey;

#ifdef _DEBUG
    ASSERT( pComboBox != NULL );
    pComboBox->AssertValid();
#endif

        // 打开串口注册表: Hardware\\DeviceMap\\SerialComm" 里面有串口的名字
    if( ::RegOpenKeyEx( HKEY_LOCAL_MACHINE,
                                            "Hardware\\DeviceMap\\SerialComm",
                                            NULL,
                                            KEY_READ,
                                            &hKey                        ) == ERROR_SUCCESS                                )
        {
                int i=0;
                char portName[256],commName[256];
                DWORD dwLong,dwSize;

                while(1)
                {
                        dwLong = dwSize = sizeof(portName);

                        // 枚举串口: Win2k/XP和Win98/Me的注册表值不同,所以用枚举
            if( ::RegEnumValue( hKey,
                                                          i,
                                                          portName,
                                                          &dwLong,
                                                          NULL,
                                                          NULL,
                                                          (PUCHAR)commName,
                                                          &dwSize ) == ERROR_NO_MORE_ITEMS )   
                        break;

                        pComboBox->AddString( commName );            // commName就是串口名字
                        i++;
                }

                // 关闭注册表
                RegCloseKey(hKey);
        }
}

出0入0汤圆

 楼主| 发表于 2009-12-10 18:12:24 | 显示全部楼层
【4楼】 qinxg

谢谢您的介绍, 多了一个思路, 不过还是对用 C# 实现有点疑惑.

出0入0汤圆

发表于 2009-12-10 20:47:31 | 显示全部楼层
应该是遍历注册表吧,给出一个vc的例子~
// 填充已存在串口名到下拉框
void CCommsetDlg::PopulatePortName()
{
        HKEY hkReceived = NULL;
        LONG retCode = 0;
        DWORD dwCount = 0;

        // 打开注册表
        retCode = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_READ, &hkReceived );

        if ( retCode == ERROR_SUCCESS )
        {
                char lpValueName[41];// = "\\Device\\Serial0";
                DWORD dwValueName = 40;

                BYTE lpData[21];
                DWORD dwData = 20;

                DWORD dwType = REG_SZ;
                DWORD dwIndex = 0;

                while ( ( retCode = RegEnumValue( hkReceived, dwIndex, lpValueName, &dwValueName, NULL, &dwType, lpData, &dwData ) ) != ERROR_NO_MORE_ITEMS )
                {
                        // 查询的结果数据类型为REG_SZ
                        if ( dwType == REG_SZ )
                        {
                                m_cbPortName.AddString( (LPCTSTR) lpData );
                                dwCount++;
                        }                       

                        dwIndex++;
                        dwData = 20;
                }

                RegCloseKey( hkReceived );
        }

        // 在注册表中没有找到合适的项时添加自定义数据
        if ( dwCount == 0 )
        {
                char *coms[] = { "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8 " };

                for ( int index = 0; index < 8; index++ )
                {
                        m_cbPortName.AddString( coms[ index ] );
                }
        }
}

出0入0汤圆

 楼主| 发表于 2009-12-12 23:36:36 | 显示全部楼层
真是失败, 谢谢楼上各位的帮助.

已经按照楼上的思路基本写好了代码, 但是今天换了下关键 Key google 了一下, 在 MSDN 找到了答案.

早知道就装 MSDN 了, 我嫌他太大了就只装了 VS2008 没有装 MSDN.

http://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport.getportnames(VS.80).aspx

一句话就搞定了:

// Get a list of serial port names.
string[] ports = SerialPort.GetPortNames();

出0入0汤圆

发表于 2010-4-15 22:31:14 | 显示全部楼层
有记得API有个函数可以实现这个功能。。忘记那个了,你查下

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-6-3 17:32

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

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