使用jSerialComm替代RXTXCOMM的串口控制
github地址:Fazecast/jSerialComm: Platform-independent serial port access for Java (github.com)
初始化(包含监听串口数据):(注意,在Linux环境下,初始化中的参数:mDevice值不需要‘/dev’的前缀,直接写设备名称即可“ttyS1”)
private com.fazecast.jSerialComm.SerialPort serialPort;public boolean install(String mDevices, int mBaudRate) { serialPort = com.fazecast.jSerialComm.SerialPort.getCommPort(mDevices); serialPort.addDataListener(new SerialPortDataListener() { @Override public int getListeningEvents() { return com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DATA_AVAILABLE; } @Override public void serialEvent(SerialPortEvent serialPortEvent) { if (serialPortEvent.getEventType() != com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DATA_AVAILABLE) return; byte[] newData = new byte[serialPort.bytesAvailable()]; int numRead = serialPort.readBytes(newData, newData.length); System.out.println("接收到串口数据长度为:" + numRead); } }); serialPort.setFlowControl(com.fazecast.jSerialComm.SerialPort.FLOW_CONTROL_DISABLED); serialPort.setComPortParameters(mBaudRate, 8, com.fazecast.jSerialComm.SerialPort.ONE_STOP_BIT, com.fazecast.jSerialComm.SerialPort.NO_PARITY); serialPort.setComPortTimeouts(com.fazecast.jSerialComm.SerialPort.TIMEOUT_READ_BLOCKING | SerialPort.TIMEOUT_WRITE_BLOCKING, 1000, 1000); serialPort.openPort();return serialPort.isOpen(); }
写数据:
public void sendHexMsg(byte[] data) throws IOException { if (this.serialPort == null || !serialPort.isOpen()) { logger.error("发送串口数据失败,数据串口未启动"); return; } serialPort.writeBytes(data, data.length); }