在 C++ 中打开一个大于 9 的 COM 端口
Posted
技术标签:
【中文标题】在 C++ 中打开一个大于 9 的 COM 端口【英文标题】:Open a COM port in C++ with number higher that 9 【发布时间】:2012-07-31 06:57:31 【问题描述】:我在 C++ 中使用 COM 端口。我无法打开大于 9 的 COM 端口,例如 10。这是用于 COM 端口检测的功能:
WCHAR port_name[7];
WCHAR num_port[4];
for (i=1; i<256; i++)
bool bSuccess = false;
wcscpy(port_name,L"COM");
wcscat(port_name,_itow(i,num_port,10));
HANDLE hPort;
//Try to open the port
hPort = CreateFile(L"COM10", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
//hPort = CreateFile(port_name, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if (hPort == INVALID_HANDLE_VALUE)
DWORD dwError = GetLastError();
//Check to see if the error was because some other application had the port open
if (dwError == ERROR_ACCESS_DENIED)
bSuccess = TRUE;
j=j+1;
else //The port was opened successfully
bSuccess = TRUE;
j=j+1;
CloseHandle(hPort); //closing the port
if (bSuccess)array_ports[j]=i;
我不明白为什么例如 COM10,将 FFFFFFFF 扔回 HANDLE hPort。
hPort = CreateFile(L"COM10", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
COM9、COM8、COM7 等工作正常,
hPort = CreateFile(L"COM9", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
这个问题有解决办法吗?
【问题讨论】:
顺便说一下,串口检测方法比较复杂。在 Windows 注册表中有一个键 HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM 用于系统中可用的串行端口。 【参考方案1】:大于 9 的 COM 端口需要使用以下格式:
\\\\.\\COM%d
其中%d
是端口号的 printf 替代项。
为什么?好吧,这访问了全局 NT 对象空间,所有对象都存储在其中。 Windows 只知道您使用它来支持 DOS 的方式为 COM0-9 起别名;除此之外,它们就像普通设备一样,可以通过这种方式访问。
要探索 NT 对象空间,我推荐WinObj,它基本上可以让您四处浏览。 \.\ 映射到此树中的GLOBAL??
(实际上与其他一些区域一样。树的其余部分要求您拥有 NT 的系统视图,而不是 Win32 的系统视图)。
如果您不知道,INVALID_HANDLE_VALUE
被定义为0xffffff...
- 这通常发生在打开失败时。
【讨论】:
【参考方案2】:这是一个bug,解决方法是使用字符串
\\.\COM10
hPort = CreateFile("\\\\.\\COM10", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
查看this 文章。
【讨论】:
感谢这个答案使我免于精神错乱:)以上是关于在 C++ 中打开一个大于 9 的 COM 端口的主要内容,如果未能解决你的问题,请参考以下文章