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
        }
} }

 

 

 

 

==========

posted @ 2023-07-10 18:57  西北逍遥  阅读(157)  评论(0编辑  收藏  举报