Java程序实现串口通信监听条码扫描器的代码(扫码枪)

引入依赖: 


    com.fazecast
    jSerialComm
    2.10.4

 主程序:


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 

你可能感兴趣的:(bakcode,Java相关,java,开发语言)