1

COM ポートに接続されたスキャナからバイト配列にバイトを読み込もうとしています。C# のシリアル ポート ライブラリには既に Read 関数があります。これは、私が読み取りを試みるために使用する関数です。読み込まれたバイトがコンソールに出力されるように設定しました。私は非常に予測可能なプロトコルを使用しているので、コードでその行を渡すときにどのような種類のバイト配列が期待されているかを知っています。ただし、プログラムを実行すると、1 バイトしか読み込まれません。プログラムの同じインスタンスを (同じ読み取りコマンドを送信して) 再実行すると、期待される残りのバイトが取得されます。これを 3 回実行して初めて、期待しているすべてのバイトを取得できます。この問題は、読み取り行にブレークポイントを挿入してその行をステップオーバーするだけで完全に回避されます。これを行うと、毎回完全に読み取れます。私の質問は、ブレークポイントを挿入せずに毎回完全な読み取りを取得するにはどうすればよいですか? System Pause アプローチを使用して実行を停止し、COM ポートを十分に高速にスキャンしようとしましたが、うまくいきませんでした。また、スレッドを使用してみました (以下のコードを参照)。これもうまくいきませんでした。助言がありますか?

    t = new Thread(() => device.Read(buffer));
    t.Start();
    t.Join();

繰り返しますが、期待される出力は、Read コマンドを数回再送信した後、またはブレークポイントを使用して上記のコマンドをステップ オーバーすることによって、完全なパケットでのみ取得されます。そうしないと、予想される出力が小さな「バイト サイズのサンプル」で得られます。どんな助けでも大歓迎です!

4

3 に答える 3

0

while ループを挿入し、バイト読み取りの間に 10 ミリ秒のスリープ時間を与えるのが最善の方法です。これにより、スキャナが COM ポートにデータを書き込むために 10 ミリ秒が与えられます。実際、スキャナーをネットワークポートに接続すると問題が発生します。

データがスキャナーから完全に読み取られたときに通知するデリゲートまたはイベントを作成することもできます。

于 2013-07-10T20:56:03.580 に答える
0

私は最近、ここにある同様の質問を投稿しました: SerialPort.DataReceived Returning Strange Results

問題は、ご存知のように、デバイスが実行中のコマンドの発行を終了したという保証なしに、プログラムがバッファから読み取ろうとすることです。私のアドバイスは、この投稿の最初の答えを実装することです: C# でのシリアル ポートからの読み取り

私の実装は DataReceived イベントで次のとおりです。

void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e)
    {
        byte[] data = new byte[serialPort.BytesToRead];
        serialPort.Read(data, 0, data.Length);
        Console.Write(System.Text.Encoding.UTF8.GetString(data));
    }

そして、コードでそれを接続するだけです:

serialPort.DataReceived += serialPort_DataReceived;
于 2013-07-10T16:24:21.650 に答える