Я разрабатываю программное обеспечение Java, которое должно иметь возможность считывать некоторые данные, отправленные устройством через последовательный COM-порт, для меня очень важна скорость связи, поэтому скорость передачи данных установлена на 921600. Вначале все работает нормально (и поэтому он читает правильные данные, которые устройство отправляет через последовательный порт), но через некоторое время программное обеспечение начинает считывать неправильные данные. Похоже, что программа слишком медленная и на самом деле теряет часть данных, когда они поступают во входной буфер (возможно, когда входной буфер полностью заполняется в первый раз). Чтобы ускорить операцию чтения, я в настоящее время использую подход к чтению, при котором программное обеспечение обрабатывает как можно больше байтов за одно чтение. Я также пытался увеличить размер входного буфера (используя метод serialPort.setInputBufferSize(byte), но это не решило мою проблему). Итак, кто-нибудь когда-либо выполнял быструю последовательную связь с java? Я что-то упускаю? Почему какое-то время все работает нормально, а потом перестает нормально работать?
Это мой код для части чтения (даже управляемой), пожалуйста, пропустите часть преобразования данных, это просто потому, что все данные на самом деле состоят из 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;
}