前言
- java jdk:1.8
- spring-boot: 2.5.12
已经写java一段时间了,最近遇到个有趣的需求,要求网站可以写入智能锁的激活码,厂家提供的协议是串口传输协议,故浅浅研究了一下串口通讯,用java全部对接完才想起来,jar包要在linux服务器部署的,获取的都是服务器的串口... 无法获取客户电脑的串口,所以最终解决方式只有如下:
- jar包在每一台用户本地下载并运行(显然很拉胯)
- 用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[]