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

引入依赖: 

<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 

### InputStream 使用方法和示例代码 `InputStream` 是 Java 中用于读取字节流的抽象类,是所有输入流的父类。它定义了多个基本的读取操作方法,包括 `read()`、`available()`、`close()` 等,这些方法可以用于从不同的数据源(如文件、网络连接等)读取字节数据[^1]。 #### 基本使用方法 1. **创建 `InputStream` 实例** 通常使用其子类来创建实例,例如 `FileInputStream` 用于从文件读取数据,`ByteArrayInputStream` 用于从字节数组读取数据等。 2. **读取数据** 使用 `read()` 方法可以从流中读取一个字节的数据。该方法返回一个 `int` 类型,表示读取的字节值(范围为 0 到 255),如果到达流的末尾则返回 -1。 3. **关闭流** 使用 `close()` 方法关闭流,释放与之关联的资源。 #### 示例代码 以下是一个使用 `FileInputStream` 从文件中读取数据的示例: ```java import java.io.FileInputStream; import java.io.InputStream; import java.io.IOException; public class InputStreamExample { public static void main(String[] args) { String filePath = "example.txt"; // 文件路径 try (InputStream is = new FileInputStream(filePath)) { int data; while ((data = is.read()) != -1) { System.out.print((char) data); // 将字节转换为字符并输出 } } catch (IOException e) { e.printStackTrace(); } } } ``` 在上述代码中,使用了 `try-with-resources` 语句来确保流在使用完毕后自动关闭。这是推荐的做法,以避免资源泄漏。 #### 复制 `InputStream` 在某些情况下,可能需要复制或克隆一个 `InputStream`。一种常见的方法是使用 `ByteArrayOutputStream` 和 `ByteArrayInputStream`。具体步骤如下: 1. 从原始的 `InputStream` 中读取数据并写入 `ByteArrayOutputStream`。 2. 使用 `ByteArrayOutputStream` 的 `toByteArray()` 方法获取字节数组。 3. 创建一个新的 `ByteArrayInputStream`,使用该字节数组作为输入源。 以下是一个示例: ```java import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.IOException; public class CloneInputStreamExample { public static void main(String[] args) { // 假设原始 InputStream 是 ByteArrayInputStream String inputString = "Hello, World!"; InputStream originalStream = new ByteArrayInputStream(inputString.getBytes()); try { // 使用 ByteArrayOutputStream 读取原始流 ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = originalStream.read(buffer)) != -1) { baos.write(buffer, 0, length); } // 创建克隆的 InputStream InputStream clonedStream = new ByteArrayInputStream(baos.toByteArray()); // 验证克隆流的内容 int data; while ((data = clonedStream.read()) != -1) { System.out.print((char) data); } } catch (IOException e) { e.printStackTrace(); } } } ``` #### 使用 `InputStream` 读取文本数据 如果需要将 `InputStream` 转换为字符流以处理文本数据,可以使用 `InputStreamReader` 和 `BufferedReader`。例如,从 `InputStream` 中读取 UTF-8 编码的文本内容: ```java import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.IOException; public class ReadTextFromInputStream { public static void main(String[] args) { // 假设原始 InputStream 是 ByteArrayInputStream String inputString = "Hello, World!"; InputStream inputStream = new ByteArrayInputStream(inputString.getBytes()); try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } } ``` 通过 `InputStreamReader`,可以将字节流转换为字符流,并指定字符编码(如 UTF-8),从而正确地处理文本数据[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值