引入依赖:
<dependency>
<groupId>com.fazecast</groupId>
<artifactId>jSerialComm</artifactId>
<version>2.10.4</version>
</dependency>
主程序:
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import com.fazecast.jSerialComm.*;
public class BarcodeScannerListener {
public static void main(String[] args) {
// 获取所有可用串口
SerialPort[] ports = SerialPort.getCommPorts();
System.out.println("可用串口:");
for (SerialPort port : ports) {
System.out.println(port.getSystemPortName() + " - " + port.getDescriptivePortName());
}
// 替换为你的虚拟串口号(如 COM3、/dev/ttyUSB0)
String portName = "COM3";
if(args.length > 0) {
portName = args[0]; // 如果有传入参数,就根据参数替换虚拟串口号
}
System.out.println("虚拟串口号:"+portName);
SerialPort serialPort = SerialPort.getCommPort(portName);
// 配置串口参数(根据扫码枪规格设置)
serialPort.setComPortParameters(
9600, // 波特率(常见值:9600)
8, // 数据位
SerialPort.ONE_STOP_BIT, // 停止位
SerialPort.NO_PARITY // 校验位
);
serialPort.setComPortTimeouts(
SerialPort.TIMEOUT_READ_SEMI_BLOCKING,
0, // 读超时(毫秒)
0 // 写超时
);
// 打开串口
if (serialPort.openPort()) {
System.out.println("串口打开成功!监听中...");
// 新增缓冲区清空操作
serialPort.flushIOBuffers(); // 清除可能存在的残留数据
} else {
System.err.println("无法打开串口!");
return;
}
// 创建读取线程
Thread readThread = new Thread(() -> {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
return;
}
String password = "111111";
String user = "root";
String url = "jdbc:mysql://127.0.0.1:3306/jangle_test1?characterEncoding=UTF8";
try (Connection connection = DriverManager.getConnection(url, user, password)){
InputStream in = serialPort.getInputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
while (true) {
int data = in.read();
if (data == -1) break;
if (data == '\r' || data == '\n') { // 扫码枪通常以回车结束
if (buffer.size() > 0) {
String barcode = buffer.toString("UTF-8").trim();
System.out.println("扫描到条码: " + barcode);
// SQL入库
PreparedStatement ps = connection.prepareStatement("update yte set status = 1 where name = ? ");
ps.setString(1, barcode);
ps.execute();
ps.close();
buffer.reset();
}
} else {
buffer.write(data);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
serialPort.closePort();
}
});
readThread.start();
// 添加关闭钩子(确保程序退出时关闭串口)
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
if (serialPort.isOpen()) {
serialPort.closePort();
System.out.println("串口已关闭");
}
}));
}
}
参考文献:AI

4036

被折叠的 条评论
为什么被折叠?



