Как читать текст с последовательного порта? - PullRequest
1 голос
/ 27 января 2009

Я пытаюсь прочитать данные с последовательного порта Windows через Java. У меня есть библиотеки 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"));

вывод первых трех строк не позволит мне копировать и вставлять (я предполагаю, потому что они не являются нормальными символами). Вот результат Hex: 78786000e67e9e60061e8606781e66e0869e98e086f89898861878809e1e9880

Я читаю с устройства Hollux GPS, которое выводит данные в строковом формате. Я знаю это наверняка, потому что я сделал это через C #.

Настройки, которые я использую для общения, которые, как я знаю, являются правильными по работе в приложении C #: Скорость в бодах: 9600 Базы данных: 8 Стоп бит: 1 четность: нет

Ответы [ 3 ]

1 голос
/ 28 января 2009

Я не могу сказать из вашего кода, но похоже, что вы используете 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) { ... }
1 голос
/ 27 января 2009

Вероятно, подключенное устройство не использует текстовый протокол. Многие устройства используют двоичный формат сообщения, в который может быть встроен текст, но представляет другую информацию с более компактными кодами.

Пожалуйста, отредактируйте свой вопрос и предоставьте дополнительную информацию, такую ​​как устройство, с которым вы общаетесь через последовательный порт, и выходные данные, которые вы получаете из кода, который вы используете. Другим полезным выводом для добавления будет то, что печатает шестнадцатеричное представление прочитанных вами данных. Быстрый и грязный метод для этого заключается в следующем:

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

Я не работал с Holux GPS, но я написал интерфейс Garmin для javax.comm. В этом случае устройство по умолчанию использует собственный (двоичный) протокол Garmin, но на устройстве может быть включен (текстовый) протокол NMEA 0183. Возможно ли, что вы получаете собственный формат сообщений Holux, и вам нужно использовать какую-либо команду на устройстве GPS для переключения протоколов?

0 голосов
/ 02 июня 2016
 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+ "    ");

, пожалуйста, выведите строку из двоичного файла

...