我正在開發一個Java軟件,它必須能夠讀取設備通過串行COM端口發送的一些數據,通信的速度對我來說非常重要,所以波特率設置爲921600. 開始時一切正常(因此它讀取設備通過串口發送的正確數據),但一段時間後軟件開始讀取錯誤的數據。 看起來軟件速度太慢,當它們進入輸入緩衝區時可能會丟失一些數據(也許輸入緩衝區第一次被完全填滿時)。 爲了加快閱讀操作,我正在使用一種閱讀方式,在閱讀方式中,軟件每次閱讀處理儘可能多的字節。 我也試圖使輸入緩衝區的大小更大(通過使用serialPort.setInputBufferSize(字節)方法,但它並沒有解決我的問題) 所以有人曾經用java做過快速串行通信?我錯過了什麼嗎? 爲什麼一切正常工作一段時間,然後停止正常工作?Java:讀取串行端口(波特率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進行垃圾回收時失敗(只是猜測Java會這麼做)。另外,串行事件是否在處理完最後一個事件之前再次觸發? – Jeff