직렬 포트에서 텍스트를 어떻게 읽습니까?
-
20-08-2019 - |
문제
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"));
처음 세 줄의 출력은 복사하여 붙여 넣을 수 없습니다 (일반 문자가 아니기 때문에 가정합니다). 다음은 16 진수의 출력입니다
문자열 형식으로 출력하는 Hollux GPS 장치에서 읽고 있습니다. 나는 C#을 통해 그것을했기 때문에 이것을 확실히 알고 있습니다.
C# 앱의 작업에서 제가 알고있는 커뮤니케이션을 위해 사용하는 설정은 다음과 같습니다. Baud Rate : 9600 Databits : 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) { ... }
다른 팁
연결된 장치는 텍스트 프로토콜을 사용하지 않을 수 있습니다. 많은 장치에서 텍스트가 포함되어있을 수 있지만 더 컴팩트 한 코드가있는 다른 정보를 나타내는 이진 메시지 형식을 사용합니다.
일련 포트를 통해 통신하는 장치 및 실행중인 코드에서 얻은 출력과 같은 질문을 편집하고 더 많은 정보를 제공하십시오. 추가하는 데 도움이되는 또 다른 출력은 읽은 데이터의 16 진수 표현을 인쇄하는 것입니다. 이를위한 빠른 방법은 다음과 같습니다.
import java.math.BigInteger;
...
System.out.println(new BigInteger(1, readBuffer).toString(16));
나는 Holux GPS와 함께 일하지 않았지만 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+ " ");
바이너리에서 끈으로 제발 제발