Java中基於Rxtx的串列埠操作
阿新 • • 發佈:2019-02-11
/** * 串列埠引數的配置 串列埠一般有如下引數可以在該串列埠開啟以前進行配置: * 包括波特率,輸入/輸出流控制,資料位數,停止位和奇偶校驗。 */ // 注:串列埠操作類一定要繼承SerialPortEventListener public class SerialPortTest1 implements SerialPortEventListener { // 檢測系統中可用的通訊埠類 private CommPortIdentifier portId; // 列舉型別 private Enumeration<CommPortIdentifier> portList; // RS232串列埠 private SerialPort serialPort; // 輸入輸出流 private InputStream inputStream; private OutputStream outputStream; // 儲存串列埠返回資訊 private String test = ""; // 單例建立 private static SerialPortTest1 uniqueInstance = new SerialPortTest1(); // 初始化串列埠 @SuppressWarnings("unchecked") public void init() { // 獲取系統中所有的通訊埠 portList = CommPortIdentifier.getPortIdentifiers(); // 迴圈通訊埠 while (portList.hasMoreElements()) { portId = portList.nextElement(); // 判斷是否是串列埠 if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { // 比較串列埠名稱是否是"COM1" if ("COM1".equals(portId.getName())) { System.out.println("找到串列埠COM1"); // 開啟串列埠 try { // open:(應用程式名【隨意命名】,阻塞時等待的毫秒數) serialPort = (SerialPort) portId.open(Object.class.getSimpleName(), 2000); System.out.println("獲取到串列埠物件,COM1"); // 設定串列埠監聽 serialPort.addEventListener(this); // 設定串列埠資料時間有效(可監聽) serialPort.notifyOnDataAvailable(true); // 設定串列埠通訊引數 // 波特率,資料位,停止位和校驗方式 // 波特率2400,偶校驗 serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,// SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); test = ""; outputStream = serialPort.getOutputStream(); } catch (PortInUseException e) { e.printStackTrace(); } catch (TooManyListenersException e) { e.printStackTrace(); } catch (UnsupportedCommOperationException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } } } // 實現介面SerialPortEventListener中的方法 讀取從串列埠中接收的資料 @Override public void serialEvent(SerialPortEvent event) { 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: //有資料到達 readComm(); break; default: break; } } // 讀取串列埠返回資訊 public void readComm() { byte[] readBuffer = new byte[1024]; try { inputStream = serialPort.getInputStream(); // 從線路上讀取資料流 int len = 0; while ((len = inputStream.read(readBuffer)) != -1) { System.out.println("實時反饋:" + new String(readBuffer, 0, len).trim() + new Date()); test += new String(readBuffer, 0, len).trim(); break; } } catch (IOException e) { e.printStackTrace(); } } // 關閉串列埠 public void closeSerialPort() { if (serialPort != null) { serialPort.notifyOnDataAvailable(false); serialPort.removeEventListener(); if (inputStream != null) { try { inputStream.close(); inputStream = null; } catch (IOException e) {} } if (outputStream != null) { try { outputStream.close(); outputStream = null; } catch (IOException e) {} } serialPort.close(); serialPort = null; } } public static void main(String[] args) { SerialPortTest1 sp = new SerialPortTest1(); sp.init(); System.out.println("輸出" + sp.test); sp.closeSerialPort(); } }
之後,用虛擬串列埠工具VSPD建立兩個串列埠,COM1和COM2,執行java程式,開啟串列埠除錯助手,從COM2向COM1傳送資料,java程式就可以在控制檯輸出資訊了。