串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。
上面说的,对于非专业人士来说,都是多余的话。
一句话简单的说:串口通讯,一般情况下指windows电脑(或者一些安卓系统,单片机系统)和硬件进行数据交互的协议(方式)(硬件指,扫码抢,扫码盒子,刷卡机,继电器等一些硬件)。
这些硬件一般通过串口线,或者是USB线, 如果不带USB线也可以通过转换成USB线的方式,和电脑连接。
举例几个场景,一个windows 系统的柜式机器,控制开门关门。
一个windows机器的闸机,控制开门关门,或者开灯关灯
一个扫码枪,想要获取扫码数据并处理扫码获得的数据。等等各种情况
我这里主要是以 继电器 和 扫码器两种情况为例子。
场景一:windows电脑控制继电器的开关**
这种场景主要是,windows主动发送串口指令到硬件,控制硬件的状态
淘宝上买了一个继电器
话不多说,直接上串口通讯代码
POM 依赖包
<dependency>
<groupId>com.fazecast</groupId>
<artifactId>jSerialComm</artifactId>
<version>2.9.0</version>
</dependency>
package com.hzsmk.serial.service;
import com.fazecast.jSerialComm.SerialPort;
import com.hzsmk.common.exception.BusinessException;
import com.hzsmk.common.util.RString;
public class SerialHander {
private static final byte[] open = new byte[] {
(byte) 0xA0,0x01,0x01,(byte) 0xA2};
private static final byte[] close = new byte[] {
(byte) 0xA0,0x01,0x00,(byte) 0xA1};
//private static final byte[] query = new byte[] {
(byte) 0xA0,0x01,0x05,(byte) 0xA6};
private static SerialPort connectPort(String portDescription,String systemPortName) {
// 列举所有可用的串口
SerialPort[] commPorts = SerialPort.getCommPorts();
for (SerialPort port : commPorts) {
String des = port.getPortDescription();
System.out.println(des);
if(RString.isNotBlank(portDescription) &&