Java 控制 485 串口

介绍

485 串口是一种半双工的串行通信接口,常被用于工业控制系统和智能家居设备中。在 Java 中,我们可以通过使用第三方库来控制 485 串口进行数据通讯。

本文将介绍如何在 Java 中控制 485 串口,并演示一个简单的示例。

准备工作

在开始之前,我们需要准备好以下工具和环境:

  • Java 开发环境
  • 485 串口设备
  • 485 串口转 USB 转接线
  • RXTXcomm 库(Java 串口通信库)

安装 RXTXcomm 库

RXTXcomm 是一个用于 Java 串口通信的开源库,我们可以通过以下步骤安装它:

  1. 下载 RXTXcomm 库的压缩包,并解压到本地目录。
  2. RXTXcomm.jar 文件复制到 Java 项目的 lib 目录下。
  3. rxtxSerial.dll 文件复制到 Java 项目的 lib 目录下(Windows 系统)。

控制 485 串口示例

下面是一个简单的 Java 控制 485 串口的示例代码:

import gnu.io.*;

public class SerialTest implements SerialPortEventListener {
    private static final String PORT_NAME = "/dev/ttyUSB0";
    private static final int TIME_OUT = 2000;
    private static final int DATA_RATE = 9600;

    private SerialPort serialPort;

    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("Could not find " + PORT_NAME);
            return;
        }

        try {
            serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT);
            serialPort.setSerialPortParams(DATA_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
        } catch (PortInUseException | UnsupportedCommOperationException | IOException | TooManyListenersException e) {
            e.printStackTrace();
        }
    }

    public synchronized void close() {
        if (serialPort != null) {
            serialPort.removeEventListener();
            serialPort.close();
        }
    }

    @Override
    public void serialEvent(SerialPortEvent event) {
        if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            try {
                // 读取串口数据
                InputStream input = serialPort.getInputStream();
                int availableBytes = input.available();
                byte[] data = new byte[availableBytes];
                input.read(data);
                System.out.println("Received data: " + new String(data));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        SerialTest serialTest = new SerialTest();
        serialTest.initialize();

        // 添加串口事件监听器
        try {
            serialTest.serialPort.addEventListener(serialTest);
            serialTest.serialPort.notifyOnDataAvailable(true);
        } catch (TooManyListenersException e) {
            e.printStackTrace();
        }

        // 关闭串口
        Runtime.getRuntime().addShutdownHook(new Thread(() -> serialTest.close()));
    }
}

流程图

flowchart TD;
    A[初始化] --> B{是否找到串口};
    B -- 是 --> C[打开串口];
    B -- 否 --> D[提示未找到串口];
    C --> E{是否监听串口事件};
    E -- 是 --> F[读取串口数据];
    E -- 否 --> G[关闭串口];
    F --> G;
    G --> H{是否收到数据};
    H -- 是 --> I[处理数据];
    I --> J{程序结束};
    J --> K[关闭串口];
    H -- 否 --> G;

类图

classDiagram
    class SerialTest {
        - PORT_NAME: String
        - TIME_OUT: int
        - DATA_RATE: int
        - serialPort: SerialPort
        + initialize()
        + close()
        + serialEvent(event: SerialPortEvent)
        + main(args: String[])
    }

结论

通过本文的介绍,我们学习了如何在 Java 中控制 485 串口,并演示了一个简单的示例。