0

シリアルポート通信を処理するアプリケーションに取り組んでいます。これは 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、チャバ

4

1 に答える 1