springboot 串口通讯

410 阅读2分钟

前言

  • java jdk:1.8
  • spring-boot: 2.5.12

已经写java一段时间了,最近遇到个有趣的需求,要求网站可以写入智能锁的激活码,厂家提供的协议是串口传输协议,故浅浅研究了一下串口通讯,用java全部对接完才想起来,jar包要在linux服务器部署的,获取的都是服务器的串口... 无法获取客户电脑的串口,所以最终解决方式只有如下:

  1. jar包在每一台用户本地下载并运行(显然很拉胯)
  2. 用js联合浏览器做串口通讯(目前已采取这种方案,还不错)

虽然最终没有采用java串口通讯的方案,但是也值得记录下,下篇可以写js串口通讯的

什么是串口通讯?

串口通讯 (Serial Communication)  ,是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。 串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。 串口按电气标准及协议来划分,包括RS-232-C、RS-422、RS485等

安装依赖

<dependency>
    <groupId>com.fazecast</groupId>
    <artifactId>jSerialComm</artifactId>
    <version>2.8.3</version>
</dependency>

实现类(简化)

...
import com.fazecast.jSerialComm.SerialPort;
...

@Service
public class SerialPortServiceImpl implements SerialPortService {

    @Autowired
    private SerialPort serialPort;

    /**
     * 发送数据
     *
     * @param data
     */
    @Override
    public void sendData(byte[] data) {
        if (serialPort.openPort()) {
            serialPort.writeBytes(data, data.length);
            serialPort.closePort();
        }
    }
    /**
     * 打开串口
     */
    @Override
    public Boolean openPort(String portName) {
        serialPort = SerialPort.getCommPort(portName);
        serialPort.setBaudRate(9600);
        serialPort.setNumStopBits(1);
        serialPort.setNumDataBits(8);
        if (serialPort.openPort()) {
            System.out.println("串口打开成功");
            return true;
        } else {
            System.out.println("串口打开失败");
            return false;
        }
    }

    /**
     * 关闭串口
     */
    @Override
    public void closePort() {
        if (serialPort != null && serialPort.isOpen()) {
            serialPort.closePort();
            System.out.println("串口关闭成功");
        } else {
            System.out.println("串口关闭失败");
        }
    }

    /**
     * 获取该设备的所有串口端口列表
     */
    @Override
    public List<SerialPortVO> getPortList() {
        SerialPort[] ports = SerialPort.getCommPorts();
        List<SerialPortVO> serialPortVOList = new ArrayList<>();
        for (SerialPort port : ports) {
            SerialPortVO serialPortVO = new SerialPortVO();
            serialPortVO.setPortName(port.getSystemPortName());
            serialPortVOList.add(serialPortVO);
        }
        return serialPortVOList;
    }
}

注意

  • PortName 是端口名称,win下 如COM1、COM2等,默认COM1;
  • BaudRate 是波特率,默认 9600;
  • DataBits 是数据位,默认是 8;
  • StopBits 是停止位,默认是System.IO.Ports.StopBits.One;
  • Parity 设定奇偶校验,默认是System.IO.Ports.Parity.None。

在打开串口前必须传入上述对应字段,否则连接会失败。串口传输格式都是 byte[]