2016-02-05 105 views
0

我的項目使用JSSC庫連接PC和微控制器。從COM端口異步讀取(使用JSSC庫)

Write方法:

public void write(byte[] buffer) throws SerialPortException { 
    if (serialPort.isOpened()) 
     serialPort.writeBytes(buffer); 
} 

Read方法:

public byte[] read() throws SerialPortException { 

    byte[] result = null; 

    FutureTask<byte[]> task = new FutureTask<>(new PortReader()); 
    ExecutorService executor = Executors.newSingleThreadExecutor(); 

    try { 
     result = (byte[]) executor.submit(task).get(1000, TimeUnit.MILLISECONDS); 
    } catch (InterruptedException | ExecutionException e) { 
     e.printStackTrace(); 
    } catch (TimeoutException e) { 
     System.err.println(getClass().getSimpleName() + " READ: Timeout exception!"); 
    } 

    return result; 
} 

private class PortReader implements Callable<byte[]>, SerialPortEventListener { 

    private byte[] data = null; 

    @Override 
    public void serialEvent(SerialPortEvent event) { 

     if (event.isRXCHAR() && event.getEventValue() > 0) { 
      try { 
       data = serialPort.readBytes(event.getEventValue()); 
      } catch (SerialPortException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    public byte[] call() throws Exception { 
     if (data == null) 
      Thread.sleep(200); 

     return data; 
    } 
} 

我試圖執行一個同步寫入(立即發送數據)發送給端口和異步讀取(等待至少所述輸入數據1000毫秒)從端口。

這是正確的決定嗎?也許還有其他的異步數據讀取方式?

謝謝!

+0

對於我編輯中的破壞評論,我感到抱歉。在完成之前我不小心敲了回車鍵,我不能再編輯這個評論,所以我會在這裏輸入它:「請僅使用[com]標籤來詢問關於微軟的」組件對象模型「的問題。端口應該用[串口]標記,而不是「。祝你好運。 –

回答

0

更好地使用等待事件在serialport類中使用。這樣,端口就可以等待命令執行完畢。

serialPort.writeBytes(buffer);//Write data to port 
serialPort.addEventListener(new PortReader(serialPort), SerialPort.MASK_RXCHAR); 
int[][] eventArray=serialPort.waitEvents() 
for (int i = 0; i < eventArray.length; i++) { 
    if ((eventArray[i][0] > 0)) { 
    serialPort.eventListener.serialEvent(new SerialPortEvent("COM1", eventArray[i][0], eventArray[i][1])); //give your port name and the events got. 
        } 
        }