シリアルポートにいくつかの基本的な書き込みを行うcファイルを実行しようとするとエラーが発生します。私は時々転送に時間がかかるので、非同期に実行しようとしています。私の元のバージョンは正常に動作したWriteFile()コマンドと同期して動作していました。私はOVERLAPPEDを初めて使用していて、それについて感謝して入力します。Windowsの非同期シリアルポート通信を
私は取得していますエラーは次のとおりです。
Debug Assertion Failed!
<path to dbgheap.c>
Line: 1317
Expression: _CrtIsValidHeapPointer(pUserData)
第2の書き込み関数が呼び出されたとき。メインで
:だっ
{
//initialized port (with overlapped), DBC, and timeouts
result = write_port(outPortHandle, 128);
result = write_port(outPortHandle, 131);
}
static void CALLBACK write_compl(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped) {
//write completed. check for errors? if so throw an exception maybe?
printf("write completed--and made it to callback function\n");
}
int write_port(HANDLE hComm,BYTE* lpBuf) {
OVERLAPPED osWrite = {0};
// Create this write operation's OVERLAPPED structure's hEvent.
osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (osWrite.hEvent == NULL)
// error creating overlapped event handle
return 0;
// Issue write.
if (!WriteFileEx(hComm, &lpBuf, 1, &osWrite, &write_compl)) {
if (GetLastError() != ERROR_IO_PENDING) {
// WriteFile failed, but isn't delayed. Report error and abort.
printf("last error: %ld",GetLastError());
return 0; //failed, return false;
}
else {
// Write is pending.
WaitForSingleObjectEx(osWrite.hEvent, 50, TRUE); //50 ms timeout
return -1; //pending
}
}
else {
return 1; //finished
}
}
ない完全なコード、申し訳ありません。私は定数ではなくBYTEの配列を使用していました。しかし、System( "pause")は私のデバッグアサーションに失敗したエラーを引き起こしていました。そして、WriteFileEx()が成功したときに、コードを慎重に調べた後、オーバーラップ構造のイベントに対して警告/コールバック関数が呼び出されることはありません。私はこれらの問題を解決しました。
ReadFileEx()関数が呼び出されたときに割り当てられた構造体(BYTEを格納できるように読み込み可能にする)に割り当てられた構造体で、単一のBYTEを処理/参照するだけで助けが必要です。私はオフセットを使用してBYTEストレージにアクセスし、オーバーラップ構造をnullにする方法を知る必要があります。オーバーラップ構造をnullにすることは、ハンドルをINVALID_HANDLE_VALUEに設定するだけで簡単ですか?
バイト配列のポインタとして定数(128,131)を使用しています。ソースを正しくコピーしましたか? – kgiannakakis