1.注意串口設備本身的性能:
發送的消息間隔,發送的時候使用線程休眠即可
2.單工還是雙工:
這個問題和使用的IO流相關。若為單工,則雖可以獲取到串口對應的輸入流和輸出流,但不能夠同時使用,也就是需要使用同步操作控制流的使用。
這樣可保證串口通信工作穩定,不至於出現跑着跑着沒有響應消息了。
public synchronized void serialEvent(SerialPortEvent event) { System.out.println("事件通知" + event.getEventType()); switch (event.getEventType()) { case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break; case SerialPortEvent.DATA_AVAILABLE:// 當有可用數據時讀取數據,並且給串口返回數據 byte[] btAryBuffer = new byte[4096]; try { if (inputStream.available() > 0) { int nLenRead = inputStream.read(btAryBuffer); if (nLenRead > 0) { byte[] btAryReceiveData = new byte[nLenRead]; System.arraycopy(btAryBuffer, 0, btAryReceiveData, 0, nLenRead); runReceiveDataCallback(btAryReceiveData); } } } catch (IOException e) { e.printStackTrace(); } break; } }
private synchronized int sendMessage(byte[] btArySenderData) { System.out.println("發送的數據" + ConvertUtil.bytesToHexString(btArySenderData)); try { synchronized (outputStream) { //防止並發 outputStream.write(btArySenderData); } } catch (IOException e) { onLostConnect(); System.out.println("輸入流崩潰"); e.printStackTrace(); return -1; } catch (Exception e) { return -1; } sendData(btArySenderData); return 0; }
