2

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

私がここで間違っていることについて何か考えはありますか?

4

2 に答える 2

1

私の記憶が正しければ、すべてが正しく機能するためには、オーバーラップしたI/Oを使用してシリアルポートアクセスを行う必要があります。これは通常、シリアルポート入力を処理するために別のスレッドを作成する必要があることを意味します。理由は正確には覚えていませんがWaitForMultipleObjects、シリアルポートを使用すると問題が発生します。

于 2009-04-21T10:57:52.203 に答える
1

WaitForMultiplObjectsのドキュメントには、以下が待機可能であると記載されています。

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

ファイルと通信ポートは言及されていないことに注意してください。

于 2009-04-26T17:59:50.310 に答える