Откройте COM-порт в C++ с номером выше 9
Я использую COM-порт в C++. Я не могу открыть COM-порты с большим числом, чем 9, например 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 обратно для обработки 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);
Это там решение для этой проблемы?
2 ответов
это ошибка, и разрешение должно использовать строку
\.\COM10
hPort = CreateFile("\\.\COM10", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
Регистрация этой статьи.
для COM-портов больше 9 необходимо использовать следующий формат:
\\.\COM%d
здесь %d
является printf-подстановкой для номера порта.
почему? Ну, это доступ к глобальному объектному пространству NT, где хранятся все объекты. Windows знает только псевдоним COM0-9 так, как вы используете его для поддержки DOS; кроме того, они действуют как обычные устройства, к которым обращаются таким образом.
чтобы исследовать пространство объектов NT, я рекомендую WinObj что в основном позволяет просматривать вокруг. \.\ сопоставляется с GLOBAL??
в этом дереве (как и некоторые другие области, на самом деле. Остального дерева требует у вас НТ по сравнению с Win32, вид системы).
и на всякий случай, если вы не знали,INVALID_HANDLE_VALUE
определяется как 0xffffff...
- обычно это происходит при сбое open.