lvhaian 发表于 2009-12-10 14:18:14

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

参考了坛子里面一个朋友的毕业设计的串口调试这块程序.

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

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

http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_512783.jpg
(原文件名:1.jpg)

bozai 发表于 2009-12-10 15:22:34

不懂,帮顶

aleyn 发表于 2009-12-10 15:32:31

用Delphi的话,只需要Cport控件,它帮你全搞定。

lvhaian 发表于 2009-12-10 15:41:09

恩, 那我再想想办法.

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

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

qinxg 发表于 2009-12-10 16:24:34

我是查找注册表的

/* -------- 从注册表里搜寻安装的串口 -----------------------
FindCommPort() : 查找电脑上的串口名字, 把串口名字写入一个ComboBox控件里
传入: pComboBoxCComboBox控件的指针
*/
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,commName;
                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);
        }
}

lvhaian 发表于 2009-12-10 18:12:24

【4楼】 qinxg

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

cinderellah 发表于 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;// = "\\Device\\Serial0";
                DWORD dwValueName = 40;

                BYTE lpData;
                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 ] );
                }
        }
}

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

dragonzxs 发表于 2010-4-15 22:31:14

有记得API有个函数可以实现这个功能。。忘记那个了,你查下

a11241200 发表于 2010-5-4 22:58:16

我也想要 我的都不知道怎么弄 不能用串口来下载
页: [1]
查看完整版本: 智能充电器上位机问题请教: 自动识别电脑上已经有的串口怎么做?[已经解决]