我正在开发一个 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;
}