シリアルポート通信を処理するアプリケーションに取り組んでいます。これは WPF のマルチスレッド アプリケーションです。COMポートを介して小さなパッケージのみを通信で送信するまで、すべてがうまくいきました。
いいえ、COM ポートでアプリケーションに送信されたデータをリッスンする必要がある段階に達しました。この大量のデータの場合、私はトラブルに巻き込まれます。必要なデータの一部を読み取る DataReceived イベントが 1 つだけ発生しました。しかし、その後、残りのデータに対して発生する DataReceived イベントはもうありません。
COM ポートを監視すると、バイトがそこにあることがわかりました。監視ソフトウェアは、キューに 2067 バイトがあることを示していますが、イベントは発生しません。
Google で同様の問題を検索しましたが、これに関連する回答を見つけることができませんでした。問題の根源をどこから探せばよいか、お分かりになりましたか。
前もって感謝します。
DataReceived ハンドラーのコードは次のとおりです。
private void comPort_DataReceived( object sender, SerialDataReceivedEventArgs e )
{
do
{
new Thread(() =>
{
OnReceivingData(new ComPortCommunicationEventArgs(DataTransferDirections.Receiving, DataTransferActions.Start));
}).Start();
byte[] packetData = null;
try
{
IsReceiving = true;
int bytesToReadCount = comPort.BytesToRead;
if ( bytesToReadCount == 0 )
{
return;
}
packetData = new byte[bytesToReadCount];
comPort.Read(packetData, 0, bytesToReadCount);
}
finally
{
IsReceiving = false;
new Thread(() =>
{
OnReceivingData(new ComPortCommunicationEventArgs(DataTransferDirections.Receiving, DataTransferActions.End));
}).Start();
}
OnPacketReceived(new PacketReceivedEventArgs(comPort.PortName, packetData.ToList()));
} while ( comPort.BytesToRead > 0 );
}
その間にわかったことは、OnPacketReceived 呼び出し (受信したデータで UI のイベントを発生させるだけ) をコメントアウトすると、データ処理が正常に機能することです。COMポートの通信エラーではないと思いますが…
更新:
私の問題の解決策を見つけました。シリアルポートの処理とは関係ありませんでした。私のデータ処理スレッドの 1 つで、ループに遭遇しました。これは、処理が成功すると終了するはずでしたが、十分なデータがないため、継続的に実行されました。それを行うと、DataReceived イベント ハンドラーがブロックされました。2 つのプロセスは、私が想定した異なるスレッド上にあるはずなので、私の理由はまだ完全には明らかではありません。しかし、これは私が間違っているようです。
とにかく処理方法を修正したところ、serislポートからデータを受信できませんでした。
お時間をいただき申し訳ありませんが、あなたのアイデアがこの問題を特定するのに役立ちました。
Br、チャバ