本篇內容參考轉載自https://blog.csdn.net/kong_gu_you_lan/article/details/80589859java
環境搭建
下載地址:http://fizzed.com/oss/rxtx-for-javathis
注意根據你的電腦選擇相應的下載包,個人電腦是64位Windowsspa
下載好後把目錄中的rxtxParallel.dll和rxtxSerial.dll拷貝到.net
JAVA_HOME\jre\bin
RXTXcomm.jar加入工程便可。線程
基礎使用
public class SerialPortManager { /** * 查找可用端口 * * @return 可用端口名稱列表 */ public static final List<String> findPorts() { //得到當前全部可用串口 Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers(); List<String> ports = new ArrayList<>(); while (portList.hasMoreElements()) { String portName = portList.nextElement().getName(); ports.add(portName); } return ports; } /** * 打開串口 * * @param portName 端口名稱 * @param baudrate 波特率 * @return 串口對象 * @throws PortInUseException 端口被佔用 */ public static SerialPort openPort(String portName, int baudrate) throws PortInUseException { try { //經過端口名識別端口 CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); //打開端口,並給端口名字和一個Timeout CommPort commPort = portIdentifier.open(portName, 2000); //判斷是否是串口 if (commPort instanceof SerialPort) { SerialPort serialPort = (SerialPort) commPort; try { // 設置一下串口的波特率等參數 // 數據位:8 // 中止位:1 // 校驗位:None serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (UnsupportedCommOperationException e) { e.printStackTrace(); } return serialPort; } } catch (NoSuchPortException e) { e.printStackTrace(); } return null; } /** * 關閉串口 */ public static void closePort(SerialPort serialPort) { if (serialPort != null) { serialPort.close(); } } /** * 發送數據 * * @param serialPort 串口對象 * @param order 待發送數據 */ public static void sendMessageToPort(SerialPort serialPort, byte[] order) { OutputStream out = null; try { out = serialPort.getOutputStream(); out.write(order); out.flush(); } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); out = null; } catch (IOException e) { e.printStackTrace(); } } } } /** * 讀取數據 */ public static byte[] readFromPort(SerialPort serialPort) { InputStream in = null; byte[] bytes = {}; try { in = serialPort.getInputStream(); // 緩衝區大小爲一個字節 byte[] readBuffer = new byte[1]; int bytesNum = in.read(readBuffer); while (bytesNum > 0) { bytes = ArrayUtils.concat(bytes, readBuffer); bytesNum = in.read(readBuffer); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (in != null) { in.close(); in = null; } } catch (IOException e) { e.printStackTrace(); } } return bytes; } /** * 添加監聽器 * * @param serialPort 串口對象 * @param listener 串口存在有效數據監聽 */ public static void addListener(SerialPort serialPort, DataAvailableListener listener) { try { // 給串口添加監聽器 serialPort.addEventListener(new SerialPortListener(listener)); // 設置當有數據到達時喚醒監聽接收線程 serialPort.notifyOnDataAvailable(true); // 設置當通訊中斷時喚醒中斷線程 serialPort.notifyOnBreakInterrupt(true); } catch (TooManyListenersException e) { e.printStackTrace(); } } /** * 串口監聽 */ public static class SerialPortListener implements SerialPortEventListener { private DataAvailableListener mDataAvailableListener; public SerialPortListener(DataAvailableListener mDataAvailableListener) { this.mDataAvailableListener = mDataAvailableListener; } public void serialEvent(SerialPortEvent serialPortEvent) { switch (serialPortEvent.getEventType()) { case SerialPortEvent.DATA_AVAILABLE: // 1.串口存在有效數據 if (mDataAvailableListener != null) { mDataAvailableListener.dataAvailable(); } break; case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2.輸出緩衝區已清空 break; case SerialPortEvent.CTS: // 3.清除待發送數據 break; case SerialPortEvent.DSR: // 4.待發送數據準備好了 break; case SerialPortEvent.RI: // 5.振鈴指示 break; case SerialPortEvent.CD: // 6.載波檢測 break; case SerialPortEvent.OE: // 7.溢位(溢出)錯誤 break; case SerialPortEvent.PE: // 8.奇偶校驗錯誤 break; case SerialPortEvent.FE: // 9.幀錯誤 break; case SerialPortEvent.BI: // 10.通信中斷 ShowUtils.errorMessage("與串口設備通信中斷"); break; default: break; } } } /** * 串口存在有效數據監聽 */ public interface DataAvailableListener { /** * 串口存在有效數據 */ void dataAvailable(); } }