Прослушивание коммуникационного порта и стандартного ввода в Win32

Я пытаюсь написать небольшую утилиту, которая сопоставляет stdin/stdout с последовательным портом (своего рода эмулятор терминала командной строки) с использованием API Win32. У меня есть следующий код, который, я думаю, должен работать, но он не получает должным образом уведомления от последовательного порта:

HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hCom = CreateFile(com_name, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, 0, NULL);

/* check for errors opening the serial port, configure, set timeouts, etc */

HANDLE hWaitHandles[2];
hWaitHandles[0] = hStdin;
hWaitHandles[1] = hCom;
DWORD dwWaitResult = 0;
for (;;) {
    dwWaitResult = WaitForMultipleObjects(2, hWaitHandles, FALSE, INFINITE);
    if(dwWaitResult == WAIT_OBJECT_0)
    {
        DWORD bytesWritten;
        int c = _getch();
        WriteFile(hCom, &c, 1, &bytesWritten, NULL);
        FlushConsoleInputBuffer( hStdin);
    } else if (dwWaitResult == WAIT_OBJECT_0+1) {
        char byte;
        ReadFile(hCom, &byte, 1, &bytesRead, NULL);
        if (bytesRead)
            printf("%c",byte);
    }
}

Любые идеи, что я делаю неправильно здесь?


person Mikeage    schedule 21.04.2009    source источник


Ответы (2)


Если я правильно помню, вам нужно сделать доступ к последовательному порту, используя перекрывающийся ввод-вывод, чтобы все работало правильно. Обычно это означает, что вам нужно создать отдельный поток для обработки ввода через последовательный порт. Точно не помню почему, но при использовании WaitForMultipleObjects возникают проблемы с последовательными портами.

person Greg Hewgill    schedule 21.04.2009
comment
хм. Я пытался избежать этого; кажется немного излишним для такой (казалось бы?) простой задачи. - person Mikeage; 21.04.2009

В документах для WaitForMultiplObjects говорится, что следующие объекты являются ожидаемыми:

* Change notification
* Console input
* Event
* Memory resource notification
* Mutex
* Process
* Semaphore
* Thread
* Waitable timer

Обратите внимание, что файлы и коммуникационные порты не упоминаются.

person Community    schedule 26.04.2009
comment
Ага; Я понял это позже. Я все еще думаю о posix select(). Технически, WaitForMultipleObjects выполняется в перекрывающемся событии, переданном в ReadFile() или WriteFile(), а не в самом порту. - person Mikeage; 27.04.2009