Как мне прочитать текст с последовательного порта?
-
20-08-2019 - |
Вопрос
Я пытаюсь считывать данные с последовательного порта 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"));
выходные данные первых трех строк не позволят мне копировать и вставлять (я предполагаю, потому что они не являются обычными символами).Вот выходные данные шестнадцатеричного:78786000e67e9e60061e8606781e66e0869e98e086f89898861878809e1e9880
Я считываю данные с устройства Hollux GPS, которое выводит данные в строковом формате.Я знаю это наверняка, потому что я сделал это через C #.
Настройки, которые я использую для связи, которые, как я знаю, являются правильными из работы в приложении C #, следующие:Скорость передачи в бодах:9600 Базы данных:8 Стоп - бит: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) { ... }
Другие советы
Вполне вероятно, что подключенное устройство не использует текстовый протокол.Многие устройства используют двоичный формат сообщения, который может содержать встроенный текст, но представляет другую информацию с помощью более компактных кодов.
Пожалуйста, отредактируйте свой вопрос и предоставьте дополнительную информацию, такую как устройство, с которым вы общаетесь через последовательный порт, и выходные данные, которые вы получаете из запущенного вами кода.Другим полезным результатом для добавления было бы что-то, что выводит шестнадцатеричное представление прочитанных вами данных.Быстрый и грязный способ для этого заключается в следующем:
import java.math.BigInteger;
...
System.out.println(new BigInteger(1, readBuffer).toString(16));
Я не работал с Holux GPS, но я написал интерфейс Garmin с помощью javax.comm.В этом случае устройство по умолчанию использует проприетарный (двоичный) протокол Garmin, но на устройстве может быть включен (текстовый) протокол NMEA 0183.Возможно ли, что вы получаете проприетарный формат сообщения Holux и вам нужно использовать какую-то команду на устройстве GPS для переключения протоколов?
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+ " ");
пожалуйста, выберите строку из двоичного файла