こんにちは、通信ポートからの非同期読み取りについて質問があります。
通信ポートから非同期で 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 ループにとどまることです。
これを解決する方法を知っている人はいますか?
ご協力ありがとうございました。