Как мне прочитать текст с последовательного порта?

StackOverflow https://stackoverflow.com/questions/484392

Вопрос

Я пытаюсь считывать данные с последовательного порта 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+ "    ");

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top