java串口通信
java串口通信
import java.io.*; import java.util.*; import gnu.io.*; public class SerialTest implements SerialPortEventListener { SerialPort serialPort; // 串口名称 private static final String PORT_NAME = "/dev/ttyUSB0"; // 波特率 private static final int BAUD_RATE = 9600; private InputStream inputStream; private OutputStream outputStream; private static final int TIME_OUT = 2000; private static final int DATA_RATE = 9600; public void initialize() { CommPortIdentifier portId = null; Enumeration portEnum = CommPortIdentifier.getPortIdentifiers(); // 取得所有可用的串口 while (portEnum.hasMoreElements()) { CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement(); if (currPortId.getName().equals(PORT_NAME)) { portId = currPortId; break; } } if (portId == null) { System.out.println("无法找到指定的串口,请检查串口是否正确连接!"); return; } try { serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT); serialPort.setSerialPortParams(BAUD_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); inputStream = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true); } catch (Exception e) { System.err.println("串口初始化失败!"); e.printStackTrace(); } } public synchronized void close() { if (serialPort != null) { serialPort.removeEventListener(); serialPort.close(); } } public synchronized void serialEvent(SerialPortEvent oEvent) { if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { try { int available = inputStream.available(); // 读取所有可用的数据 byte[] chunk = new byte[available]; inputStream.read(chunk, 0, available); // 读取数据 System.out.print(new String(chunk)); // 输出数据到控制台 } catch (Exception e) { System.err.println("串口读取失败:" + e); } } else if (oEvent.getEventType() == SerialPortEvent.OPENED) { System.out.println("串口已经打开!"); } else if (oEvent.getEventType() == SerialPortEvent.CLOSED) { System.out.println("串口已经关闭!"); } else if (oEvent.getEventType() == SerialPortEvent.ERROR_OUTPUT) { // 输出错误信息到控制台 System.err.println("串口输出错误:" + oEvent.getErrorText()); // getErrorText() 返回错误消息字符串 } else if (oEvent.getEventType() == SerialPortEvent.ERROR_INPUT) { // 忽略输入错误消息 } else if (oEvent.getEventType() == SerialPortEvent.ERROR_OUTPUT_OVERFLOW) { // 输出错误消息到控制台并忽略溢出错误(即缓冲区已满,无法写入更多数据) System.err.println("串口输出溢出:" + oEvent.getErrorText()); // getErrorText() 返回错误消息字符串 缓冲区溢出错误消息是在缓冲区已满时发送的。这个错误是由于应用程序尝试写入缓冲区而无法写入,因为缓冲区已经满了。此错误通常被视为可忽略的,因为它只是表示应用程序在写入时太慢,没有及时停止写入。忽略此错误消息不会导致任何严重后果。 输入错误消息:事件类型ERROR_INPUT表示从串口读取数据时发生错误。此错误类型是可选项,因此您可以选择忽略它。如果您的应用程序需要从串口读取数据,则应该使用ERROR_INPUT事件类型来捕获和处理输入错误消息。 输出溢出错误消息:事件类型ERROR_OUTPUT_OVERFLOW }
} }
==========
QQ 3087438119