2

こんにちは、通信ポートからの非同期読み取りについて質問があります。

通信ポートから非同期で 1 バイトを読み取る関数があります。この関数は約 10ms ごとに呼び出されます。同期しようとしましたが、関数が完了するよりも速く呼び出されるため、バッファ オーバーランが発生します。今、私はそれを非同期に実装したいと考えています。しかし、それがどのように機能しているのか理解できません。

私の関数呼び出し(10ミリ秒ごとに呼び出されます):

// read one byte into receiveChar
bytesReceived = BSP_cliGetChar(&receiveChar);

関数本体

int BSP_cliGetChar(char *rxBuffer)
{
DWORD numOfBytesRead;
OVERLAPPED readOverlapped;
HANDLE hEvent;
BOOL fOverlapped;
char str[255];

hEvent = CreateEvent(NULL,    // default security attribute
                     TRUE,    // manual-reset event 
                     TRUE,    // initial state = signaled 
                     NULL);   // unnamed event object 

// set up overlapped structure fields
readOverlapped.Offset     = 0; 
readOverlapped.OffsetHigh = 0; 
readOverlapped.hEvent     = hEvent; 

if (!ReadFile(hComm, rxBuffer, 1, &numOfBytesRead, &readOverlapped))
{
  if (GetLastError() != ERROR_IO_PENDING)
  {
     // Some other error occurred while reading the file.
     ExitProcess(0);
  }
  else
     fOverlapped = TRUE;
}
else
{
  // Operation has completed immediately.
  fOverlapped = FALSE;
  return (int) numOfBytesRead;
}
while(!HasOverlappedIoCompleted(&readOverlapped))
{
   sprintf_s(str, "%d", &numOfBytesRead);
   OutputDebugString(str);
}

}

今私が欲しいのは、COMポートから1バイトを読み取ることです。ERROR_IO_PENDING が返された場合、呼び出し関数は続行する必要があります。そして、1 バイトが受信された場合にのみ、BSP_cliGetChar 関数が返されます。問題は、呼び出し手順を続行するのではなく、メソッドが while ループにとどまることです。

これを解決する方法を知っている人はいますか?

ご協力ありがとうございました。

4

1 に答える 1