智能充电器上位机问题请教: 自动识别电脑上已经有的串口怎么做?[已经解决]
参考了坛子里面一个朋友的毕业设计的串口调试这块程序.现在在改进过程中请教这么个问题:
怎么才能自动识别电脑上已经有的串口端口?VS2008 中 SerialPort 控件.
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_512783.jpg
(原文件名:1.jpg) 不懂,帮顶 用Delphi的话,只需要Cport控件,它帮你全搞定。 恩, 那我再想想办法.
我本来以为是扫描下, 每个串口都尝试下打开, 如果能打开的那就列出来.
不过后来想想这样做法不是很正确. 我是查找注册表的
/* -------- 从注册表里搜寻安装的串口 -----------------------
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);
}
} 【4楼】 qinxg
谢谢您的介绍, 多了一个思路, 不过还是对用 C# 实现有点疑惑. 应该是遍历注册表吧,给出一个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 ] );
}
}
} 真是失败, 谢谢楼上各位的帮助.
已经按照楼上的思路基本写好了代码, 但是今天换了下关键 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(); 有记得API有个函数可以实现这个功能。。忘记那个了,你查下 我也想要 我的都不知道怎么弄 不能用串口来下载
页:
[1]