문제

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+ "    ");

바이너리에서 끈으로 제발 제발

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top