2016-05-30 2 views
-3

私はシリアルポートから温度を取得します。java、このような番号の代わりにシンボルを取得

try { 
        while (inputStream.available() > 0) { 
         int n = inputStream.available(); 
         readBuffer = new byte[n]; 
         inputStream.read(readBuffer, 0, n); 
        } 
        int i=1; 
        String y = new String(readBuffer, StandardCharsets.ISO_8859_1); 
        String str = new String(readBuffer, "UTF-8"); 

        String ye = new String(readBuffer); 
        String b = new BigInteger(1, readBuffer).toString(); 
        jTextField3.setText(" " + str + " "); 
+0

これはバイナリデータです –

+0

まあ、あるものの、6バイトのように見えますが、これは "a"の数字の長さではありません。データが書き込まれるワイヤ形式は何ですか? –

+0

バイナリを文字列に変換するのを手伝ってください。 – Thambi

答えて

1

これは、シリアルポートがバイナリで値を与えるためです。テキストではありません。それらを正しく文字列に変換するためには、値の正確なフォーマット(2または4バイト、符号付きまたは符号なし、...)を見つける必要があります。

+0

https://www.youtube.com/watch?v=hteeNdA7pOoこの動画ではうまくいきますが、なぜシンボルが必要なのですか? – Thambi

2

inputStreamDataInputStreamにラップし、readByte(),の方法を使用して、ストリームから正しい種類のデータを読み込みます。

+0

youtube.com/watch?v=hteeNdA7pOoこの動画ではうまくいきますなぜシンボルが必要なのですか、私に助けてください – Thambi

0

available()は、アシクロンポーリングのためのもので、0になると正の数が得られます。最良の方法は、バッファをブロックする方法です。

byte[] readBuffer = new byte[0]; 
try { 
    for (;;) { 
      int n = inputStream.available(); 
      if (n <= 0) { 
       break; 
      } 
      readBuffer = new byte[n]; 
      inputStream.read(readBuffer, 0, n); 
      break; 
    } 
    String y = new String(readBuffer, StandardCharsets.ISO_8859_1); 
    jTextField3.setText(" \"" + y + "\" "); 
    jTextField3.setText(Arrays.toString(readBuffer))); 
    } 

バイトにエンコードが欠落していました。おそらく、データをバイト配列として保持するのが最善の方法です。

+0

なぜここにループがありますか?あなたは無条件で壊れます。そして、これは本当に何かを変えますか?この問題は、利用可能なデータがないとは思われません。データが読み取られると、デフォルトのcharsetの文字列のバイトとして解釈できません。 –

+0

@AndyTurner 'available()'をテストするのが良いスタイルではないので、意図的に醜いコードを作りました。おそらく、固定サイズのバッファの断片をループして収集しない限り。それは0,2,1,0,0,8,1を提供することができます。私には不明な動作をしているシリアルポート - 最初の数千のゼロを受信するのは不思議ではありません。 **私のコードは有効な解決策ではありません。** –

+0

あなたのコードは私にこのシンボルを与えます。 – Thambi

関連する問題