我在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);
它有解决这个问题的方法吗?
这是一个错误,解决方法是使用字符串
\\.\COM10
hPort = CreateFile("\\\\.\\COM10", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
检查this文章。
对于大于9的COM端口,您需要使用以下格式:
\\\\.\\COM%d
其中%d
是端口号的printf替换。
为什么?好吧,这会访问存储所有对象的全局NT对象空间。 Windows只知道您使用它支持DOS的方式的别名COM0-9;除此之外,它们就像普通设备一样,以这种方式访问。
为了探索NT对象空间,我推荐WinObj,它基本上可以让你浏览。 \。\映射到此树中的GLOBAL??
(实际上也是其他一些区域。树的其余部分要求你有NT,而不是Win32的系统视图)。
如果你不知道,INVALID_HANDLE_VALUE
被定义为0xffffff...
- 这通常发生在开放失败时。