如何检测本机的Com口的个数?我的情况比较特殊。

shangke_sks 2003-05-31 11:14:30
加精
手机,用usb连电脑,没连的时候,电脑只有两个com口,连了手机后,有4个。拔下来,又剩两个。

我需要访问com3控制手机,如果我把手机插上,再连,没问题。

如果我不插手机,用程序连接com3,会报告连接失败,如果这时候把手机连接到电脑上,再试图连接com3,无论如何也不能成功的创建连接。必须重新启动计算机。

我想,有两个方法能解决
1,有什么方法能把连接失败的后果清掉。
2,在连接之前判断一下有哪些com口,这个过程绝对不能用尝试连接的方法来确定。应该有专门的函数吧。

请高人指点。

谢谢。
...全文
356 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
NowCan 2003-06-02
  • 打赏
  • 举报
回复
估计没有专门的函数,只能自己读注册表。
你那两个多出的串口是虚拟串口吧。
shangke_sks 2003-06-02
  • 打赏
  • 举报
回复
楼上的兄弟给的方法很好,谢谢了,

但是我觉得是不是有什么直接的函数能解决这个问题,而不是自己去读注册表。


zhangnanonnet 2003-06-02
  • 打赏
  • 举报
回复
检查注册表这个位置就行了
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
所有的串口注册信息都在这
shangke_sks 2003-06-02
  • 打赏
  • 举报
回复
谢谢大家了。
winthegame 2003-06-02
  • 打赏
  • 举报
回复
Wonderful, 这个API 真的没听过,更别说用过了,相关API 已经记录在案,呵呵,佩服一下!
masterz 2003-06-02
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <regstr.h>
#pragma comment(lib,"Setupapi.lib")
void printdata(LPVOID pdata,DWORD datalen,DWORD type);

int main( int argc, char *argv[ ], char *envp[ ] )
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;

// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(NULL,
0, // Enumerator
0,
DIGCF_PRESENT | DIGCF_ALLCLASSES );

if (hDevInfo == INVALID_HANDLE_VALUE)
{
// Insert error handling here.
return 1;
}

// Enumerate through all devices in Set.
int nComCount = 0;
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
&DeviceInfoData);i++)
{
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;

//
// Call function with null to begin with,
// then use the returned buffer size
// to Alloc the buffer. Keep calling until
// success or an unknown failure.
//
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_DEVICEDESC,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (char*)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
if(strcmp(buffer,"Communications Port")==0)
nComCount++;
//printf("SPDRP_DEVICEDESC:[%s]\n",buffer);
if (buffer) LocalFree(buffer);
continue;
}
if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
// Insert error handling here.
return 1;
}
printf("Communications Port count:%d by masterz\n",nComCount );

// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);

return 0;
}
//HOWTO: Force Reenumeration of a Device Tree From an Application Q259697
winthegame 2003-06-02
  • 打赏
  • 举报
回复
这种情况读注册表是读不出来的, 即插即用,和偶用USB扩展出来的串口一样情况,可以象用其它串口一样正常使用,而使用WM_DEVICECHANGE 等消息通知也不能时时刻刻监视,实在讨厌,看看这样行不行,一个一个去试着打开试试,不过讨厌的是,别的程序打开了你的程序打开就是失败。算吧,当是UP, 听听有没有更好的建议。
cqiu2000 2003-06-01
  • 打赏
  • 举报
回复
ClearCommError


guoyin 2003-06-01
  • 打赏
  • 举报
回复
帮你顶
曾经的猎狐 2003-06-01
  • 打赏
  • 举报
回复
up

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧