在Win32中侦听comm端口和stdin

时间:2009-04-21 10:50:12

标签: winapi serial-port polling waitformultipleobjects

我正在尝试编写一个小实用程序,它使用Win32 API将stdin / stdout映射到串行端口(各种命令行终端模拟器)。我有以下代码,我认为应该可以使用,但它似乎没有正确地从串口接收通知:

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);
    }
}

我在这里做错了什么想法?

2 个答案:

答案 0 :(得分:1)

如果我没记错的话,你需要使用重叠的I / O进行串口访问才能使一切正常工作。这通常意味着您需要创建一个单独的线程来处理串行端口输入。我不记得为什么,但是使用WaitForMultipleObjects时串口有问题。

答案 1 :(得分:1)

WaitForMultiplObjects的文档说以下是可以等待的:

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

请注意,未提及文件和通信端口。