1

Java を介して Windows シリアル ポートからデータを読み取ろうとしています。私は javax.comm ライブラリを持っており、データを取得できますが、正しいデータは取得できません。ポートをバイト配列に読み取ってテキストに変換すると、一連の文字が表示されますが、実際のテキスト文字列は表示されません。バイト配列を「UTF-8」と「US-ASCII」の両方として指定しようとしました。これから実際のテキストを取得する方法を知っている人はいますか?

これが私のコードです:

while (inputStream.available() > 0) {
 int numBytes = inputStream.read(readBuffer);
 System.out.println("Reading from " + portId.getName() + ": ");
 System.out.println("Read " + numBytes + " bytes");
}

System.out.println(new String(readBuffer));
System.out.println(new String(readBuffer, "UTF-8"));
System.out.println(new String(readBuffer, "US-ASCII"));

最初の 3 行の出力では、コピー アンド ペーストができません (通常の文字ではないためだと思います)。Hex の出力は次のとおりです。

文字列形式で出力する Hollux GPS デバイスから読み取っています。私はC#でそれをやったので、これは確かに知っています。

私が通信に使用している設定は、C# アプリでの作業から正しいことがわかっています。 ボーレート: 9600 データビット: 8 ストップ ビット: 1 パリティ: なし

4

3 に答える 3

1

コードからはわかりませんがjava.io.InputStream、オブジェクトの読み取りに使用しているようです。java.io.BufferedReaderまたは のいずれかを使用する必要がありますjava.io.InputSreamReader

これを行うには多くの方法がありますが、これを使用します。

javax.comm.SerialPort port = ...{initialize your serial port}
BufferedReader portReader = 
    new BufferedReader(new InputStreamReader(port.getInputStream()));

try {
    String line = portReader.readLine();
} catch(IOException e) { ... }
于 2009-01-28T13:59:51.970 に答える
1

接続されたデバイスがテキスト プロトコルを使用していない可能性があります。多くのデバイスは、テキストが埋め込まれている可能性があるバイナリ メッセージ形式を使用しますが、他の情報はよりコンパクトなコードで表します。

質問を編集して、シリアル ポート経由で通信しているデバイスや、実行しているコードから取得した出力などの詳細情報を提供してください。追加するのに役立つもう 1 つの出力は、読み取ったデータの 16 進数表現を出力するものです。そのための簡単な方法は次のとおりです。

import java.math.BigInteger;
...
System.out.println(new BigInteger(1, readBuffer).toString(16));

Holux GPS を使ったことはありませんが、javax.comm で Garmin インターフェイスを作成しました。その場合、ユニットはデフォルトで独自の (バイナリ) Garmin プロトコルを使用しますが、(テキストベースの) NMEA 0183 プロトコルをデバイスで有効にすることができます。独自の Holux メッセージ形式を受信して​​いて、GPS ユニットで何らかのコマンドを使用してプロトコルを切り替える必要がある可能性はありますか?

于 2009-01-27T17:49:27.420 に答える
0
 byte[] readBuffer = null;
                try {
                    while (inputStream.available() > 0) {
                        int n = inputStream.available();
                        readBuffer = new byte[n];
                        inputStream.read(readBuffer, 0, n);
                    }
                    String y = new String(readBuffer, StandardCharsets.ISO_8859_1);
                    String str = new String(readBuffer, "UTF-8");
                    jTextField3.setText("    " + str+ "    ");

バイナリから文字列を作成してください

于 2016-06-02T12:33:02.433 に答える