직렬 소프트웨어 포트를 통해 장치에서 보낸 일부 데이터를 읽을 수 있어야하는 Java 소프트웨어를 개발 중이므로 통신 속도가 매우 중요합니다. 전송 속도는 921600으로 설정됩니다. 처음에는 모든 것이 잘 작동하므로 (장치가 직렬 포트를 통해 전송하는 올바른 데이터를 읽음) 소프트웨어가 잘못된 데이터를 읽기 시작합니다. 소프트웨어가 너무 느리고 실제로 입력 버퍼에 들어가는 동안 데이터 손실이 발생합니다 (입력 버퍼가 처음으로 완전히 채워 졌을 때). 읽기 작업을 빠르게하기 위해 나는 현재 소프트웨어가 읽기 당 가능한 많은 바이트를 다루는 읽기 접근 방식을 사용하고 있습니다. 또한 serialPort.setInputBufferSize (byte) 메서드를 사용하여 입력 버퍼 크기를 더 크게 만들려고 시도했지만 내 문제가 해결되지 않았습니다. 그래서 Java로 빠른 직렬 통신을 한 사람이 있습니까? 내가 놓친 게 있니? 모든 것이 잠시 동안 제대로 작동 한 다음 제대로 작동하지 않는 이유는 무엇입니까?Java : 직렬 포트 읽기 (baudrate 921600)
이것은 읽기 부분 (내 동등한 경우) 코드입니다. 모든 데이터가 실제로 2 바이트 씩 구성되어 있기 때문에 데이터 변환 부분을 건너 뛰고 작성하기 전에 작성해야합니다. txt 파일.
/**
*
* @param evt
*/
@Override
public void serialEvent(SerialPortEvent evt) {
switch(evt.getEventType()) {
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
System.out.println("THE OUTPUT BUFFER IS EMPTY");
break;
case SerialPortEvent.DATA_AVAILABLE:
try {
while(SerialPortEvent.DATA_AVAILABLE == 1) {
num_bytes = input.available();
array = new byte[num_bytes];
bytes_read = input.read(array, 0, num_bytes);
dato = new short[bytes_read];
datoc = new int[bytes_read/2];
datos = new String[bytes_read/2];
for(j=0;j<bytes_read;j++){
dato[j] = (short) (((byte) array[j]) & 0xff);
}
k = 0;
for(j=0;j<(bytes_read/2);j++){
datoc[j] = dato[k];
datoc[j] = (datoc[j]<<8) + dato[k+1];
datoc[j] = datoc[j] & 0xffffffff;
k = k + 2;
}
for(j=0;j<(bytes_read/2);j++){
System.out.println(datoc[j]);
datos[j] = Integer.toString(datoc[j]);
output1.write(datos[j] + " ");
}
}
} catch(IOException ex) {
logText = "Failed to read data. (" + ex.toString() + ")";
System.out.println(logText);
}
break;
}
얼마나 걸리나요? 실패하기 전에 한 시간 동안 데이터를 처리 할 수 있다면 메모리 누수가 있거나 Java가 가비지 콜렉션을 수행하는 동안 오류가 발생했다고 추측 할 수 있습니다. 또한 마지막 이벤트 처리를 완료하기 전에 직렬 이벤트가 다시 실행됩니까? – Jeff