CreateFile не может использовать последовательный (COM) порт - PullRequest
0 голосов
/ 07 мая 2018

Функция CreateFile полезна для открытия файлов или устройств для доступа для чтения / записи, обеспечивая дескриптор.

Третий параметр, dwShareMode , указывает, могут ли другие файлы впоследствии получить доступ к файлу / устройству. Пример с файлами:

void* pFileHandle1 = ::CreateFileA("C:\\test.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
DWORD lastError = GetLastError(); // 0, ERROR_SUCCESS
void* pFileHandle2 = ::CreateFileA("C:\\test.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
lastError = GetLastError(); // 0, ERROR_SUCCESS

Все хорошо здесь: у нас есть 2 разных дескриптора, которые могут читать / записывать один файл.

Но в моем случае я хочу использовать COM-порт:

void* pComHandle1 = ::CreateFileA("\\\\.\\COM3", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
lastError = GetLastError(); // 0, ERROR_SUCCESS
void* pComHandle2 = ::CreateFileA("\\\\.\\COM3", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
lastError = GetLastError(); // 5, ERROR_ACCESS_DENIED Oops!

Первый дескриптор действителен и может использоваться, но второй - INVALID_HANDLE_VALUE.

Что с этим? Разве вы не можете использовать COM-порты таким образом?

1 Ответ

0 голосов
/ 07 мая 2018

Цитирование документации для CreateFile:

Функция CreateFile может создать дескриптор ресурса связи, такого как последовательный порт COM1. Для коммуникационных ресурсов параметр dwCreationDisposition должен быть OPEN_EXISTING, параметр dwShareMode должен быть нулевым (монопольный доступ), а параметр hTemplateFile должен быть NULL. Можно указать доступ для чтения, записи или чтения / записи, а также можно открыть дескриптор для перекрывающегося ввода-вывода.

Вывод этой документации означает, что объекты связи не могут быть общими, как обычные файлы. Windows API оставляет за кем-либо, кто открыл порт, решать, как / если они хотят делиться доступом к этому ресурсу, и оставляет их для управления последствиями этого решения.

Для совместного использования порта вы можете использовать DuplicateHandle и передать его тому, кому вы хотите предоставить доступ к порту после того, как вы его открыли. Для дальнейшего чтения, прочитайте эту древнюю статью из MSDN

Тем не менее, если вы хотите разделить COM-порт между несколькими процессами, лучше открыть его только в одном из них и использовать некоторую форму IPC для передачи данных. Пусть один процесс обрабатывает обслуживание порта.

...