0

これは私のコードです。 rxtxを使用しています。

public void Send(byte[] bytDatos) throws IOException {
        this.out.write(bytDatos);
    }

    public byte[] Read() throws IOException {

        byte[] buffer = new byte[1024];

        int len = 20;

        while(in.available()!=0){
            in.read(buffer);
        }

        System.out.print(new String(buffer, 0, len) + "\n");

        return buffer;
    }

残りのコードはこれとまったく同じです。2 つの点を変更しただけです。

InputStream in = serialPort.getInputStream();
OutputStream out = serialPort.getOutputStream();

それらは現在グローバル変数であり、...

(new Thread(new SerialReader(in))).start();
(new Thread(new SerialWriter(out))).start();

今は存在しない...

これを送信しています(毎秒)

Send(("123456789").getBytes());

そして、これは私が得たものです:

123456789123
456789
123456789
1234567891
23456789

誰でも私を助けることができますか?

編集

後で、私はそれを解決するためのより良い方法を得ました。ありがとう、これは読み取りコードでした

public byte[] Read(int intEspera) throws IOException {

        try {
            Thread.sleep(intEspera);
        } catch (InterruptedException ex) {
            Logger.getLogger(COM_ClComunica.class.getName()).log(Level.SEVERE, null, ex);
        }//*/

        byte[] buffer = new byte[528];

        int len = 0;


        while (in.available() > 0) {
            len = in.available();
            in.read(buffer,0,528);
        }

        return buffer;
    }

あの眠りを消すのは無理だったけど問題ないからありがとう

4

2 に答える 2

1

実際、 InputStream.availableは次のように定義されていることに注意してください...

この入力ストリームのメソッドの次の呼び出しによってブロックされることなく、この入力ストリームから読み取る (またはスキップする) ことができる推定バイト数を返します。次の呼び出しは、同じスレッドまたは別のスレッドである可能性があります。このバイト数の 1 回の読み取りまたはスキップはブロックされませんが、より少ないバイト数の読み取りまたはスキップが行われる可能性があります。

ご覧のとおり、これは期待したものではありません。代わりに、InputStream.read()が を返すことで示されるストリームの終わりを確認する必要があります-1

さらに、読み取りループの前の反復で既に読み取ったデータの量を覚えていないため、バッファー内の以前のデータを上書きする可能性がありますが、これも意図したものではありません。

あなたが望んでいるように見えるのは、次のようなものです。

private static final int MESSAGE_SIZE = 20;

public byte[] read() throws IOException {
  final byte[] buffer = new byte[MESSAGE_SIZE];
  int total = 0;
  int read = 0;
  while (total < MESSAGE_SIZE
            && (read = in.read(buffer, total, MESSAGE_SIZE - total)) >= 0) {
    total += read;
  }
  return buffer;
}

これにより、最大20 バイトの読み取りが強制され、ストリームの最後に到達した場合はそれより少なくなります。

投稿の品質を維持し、それらが正しいことを確認するように思い出させてくれた EJP に特に感謝します。

于 2012-08-04T04:05:01.200 に答える
1

テストを取り除きavailable()ます。ブロックせずに読み取る準備ができているデータがあるかどうかを通知するだけです。これは、メッセージ全体がどこで終わるかを伝えることと同じではありません。の正しい使用法はほとんどなくavailable(),、これはその 1 つではありません。

読み取り時にバッファポインタを進めます。これまでに読み取ったバイト数を追跡​​し、それを read() の 2 番目のパラメーターとして使用し、3 番目のパラメーターとして buffer.length を使用する必要があります。

于 2012-08-04T04:06:55.130 に答える