代码之家  ›  专栏  ›  技术社区  ›  Mikeage

在win32中监听通信端口和stdin

  •  2
  • Mikeage  · 技术社区  · 15 年前

    我正在尝试编写一个小实用程序,它使用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 回复  |  直到 15 年前
        1
  •  1
  •   Greg Hewgill    15 年前

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

        2
  •  1
  •   anon    15 年前

    waitformultiplobjects的文档表示以下是可等待的:

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

    请注意,没有提到文件和通信端口。

    推荐文章