私は単純なアプリケーションを持っており、1 分間に 1 バイトをシリアル ポートに送信する必要があります。しかし、奇妙な理由から、WriteFile() 関数のどこかでフリーズすることがあります。sw と hw の両方のフロー制御がオフになります。別のスレッドから実行された保留中の読み取り操作についていくつかグーグルで検索しましたが、アプリには単一のスレッドがあるため、これは問題ではないと思います。また、CreateFile からのハンドルは有効に見えるため、ポートを他のアプリケーションで使用しないでください。誰かがこれに苦しんだことがありますか?
4 に答える
writefile hangsという単語をグーグルで検索すると、この問題に関する多くの議論が見つかります。いくつかのリードは、バッファ オーバーラン、バッファの正しいサイズ設定、COM ポートの欠陥、エラー時のステータスのクリアなどです。試してみるべきことがたくさんあるようです。
私が提案するもう 1 つのことは、API を直接呼び出す代わりに、Async Professional ( http://sourceforge.net/projects/tpapro/ ) のような通信ライブラリを使用することです。アプリケーションに多少のオーバーヘッドが追加されたとしても、作業を簡素化し、多くの潜在的な落とし穴を回避できる可能性があります...
しばらく放置されていましたが、現在再び活発に開発されているComPortを試すこともできます。
CommPortDriver.CheckLineStatus を true に設定してみましたか (「デバイスが接続されていないとき、またはデバイスがオフのときにハングしないようにするため」)。comdrv32.pas ライブラリのソースには、その提案が含まれています。
さて、私はこのライブラリを使用しています: http://lhdelphi.ic.cz/uploader/storage/ComDrv32.pas in Delphi 7, on Windows XP, しかし、内部のコンポーネントは、いくつかの Win API 呼び出し、CreateFile の単なるラッパーです。書き込みファイルなど