0

シリアルポートを介してスケールをコンピューターに接続しています。ループ内で値SerialPort.BytesToReadが0に達したときの値を確認します。ただし、BytesToReadが0に等しくなくても、ループは終了します。新しいユーザーであるためスクリーンショットを投稿できませんが、デバッグを実行すると、BytesToReadが実際には0ではないことがわかります。

その結果、データが完全に読み取られなくなります。のようなさまざまな表現を試しまし_port.BytesToRead > 0たが、結果は同じです。BytesToReadの値を変数に割り当てても、0が返されます。ループがないと、ReadExistingはスケールから送信されたすべてのデータを返さないため、実際に選択することはできません。ReadLineも機能しません。では、なぜBytesToReadは常に0なのですか?

private void PortDataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        {
            var input = string.Empty;
            // Reads the data one by one until it reaches the end
            do
            {
                input += _port.ReadExisting();
            } while (_port.BytesToRead != 0);

            _scaleConfig = GenerateConfig(input);

            if (ObjectReceived != null)
                ObjectReceived(this, _scaleConfig);
        }
    }
4

3 に答える 3

2

私の上司はそれを理解しました。これがコードです。

private void PortDataReceived2(object sender, SerialDataReceivedEventArgs e)
    {
        var bytesToRead = _port.BytesToRead;
        _portDataReceived.Append(_port.ReadExisting());

        // Buffer wasn't full. We are at the end of the transmission.
        if (bytesToRead < _port.DataBits)
        {
            //Console.WriteLine(string.Format("Final Data received: {0}", _portDataReceived));
            IScalePropertiesBuilder scaleReading = null;

            scaleReading = GenerateConfig(_portDataReceived.ToString());
            _portDataReceived.Clear();


            if (ObjectReceived != null)
            {
                ObjectReceived(this, scaleReading);
            }
        }
    }
于 2012-06-04T13:59:13.837 に答える
2

コードがバッファを空にしたため、またはデバイスがまだ送信していないためにバッファが空であるかどうかをコードが認識できないため、元のコードは奇妙でした。(これは設計の基本的な問題のようです。すべてのバイトを取得するまで読み取りたいのですが、すべてのバイトを読み取った後でないと、存在すべき数を把握できません)。

DataBitsはバイトあたりのビット数(5〜8を含む)のシリアル構成であるため、後のコードはさらに奇妙です。RS232でのみ、バイトを8ビット未満にすることができます。

そうは言っても、BytesToReadの周りで非常に奇妙な動作が見られます。それはほとんど完全に信頼性が低く、有用になった後でのみ更新する必要があるように思われます。一貫性がないことについてのMSDNに関するメモがありますが、私が見たように、説明できないほど0である場合は含まれていません。

于 2012-11-10T00:32:28.447 に答える
1

おそらく、デバッガーを実行しているときは、実際に読み取るバイトが存在するほど遅くなりますが、デバッガーなしで実行しているため、ブレークポイントが発生しない場合は、シリアルポート上のデバイスがループを終了する前にループを終了します。データを送信する時間。ほとんどの場合、ReadExistingはポート上のすべてのデータを読み取り、ポートに新しいデータがないため、すぐに終了します。おそらく問題を軽減するために、データの読み取りとBytesToReadの値をチェックすることによってさらにデータがあるかどうかをチェックするまでの間に、(おそらくThread.Sleep()を使用して)少し待つことができます。おそらく、読み取ろうとしているデータに必要なすべてのデータを実際に読み取ったかどうかを判断するために、読み取っているデータを確認する必要があります。

于 2012-05-30T20:25:47.540 に答える