マップする小さなユーティリティを書こうとしています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);
}
}
私がここで間違っていることは何ですか?
回答:
回答№1は1私が正しく覚えているなら、あなたはシリアルをする必要がありますすべてが正しく機能するために、オーバーラップI / Oを使用したポートアクセス。これは通常、シリアルポート入力を処理するために別のスレッドを作成する必要があることを意味します。理由は正確には覚えていませんが、 WaitForMultipleObjects
シリアルポートに問題があります。
回答№2の場合は1
WaitForMultiplObjectsのドキュメントには、以下が待機可能であると記載されています。
* Change notification
* Console input
* Event
* Memory resource notification
* Mutex
* Process
* Semaphore
* Thread
* Waitable timer
ファイルと通信ポートは言及されていないことに注意してください。