【串口通讯】扫码抢的环境配置

一.配置环境

1.配置本地环境

1.1下载依赖包

从分享的文件中找到rxtxSerial.dll和RXTXcomm.jar

1.2将rxtxSerial.dll文件添加到本地环境中<系统盘>\Windows\System32

1.3将rxtxSerial.dll文件添加到JAVA_HOME环境中

先进入cmd:

输入java -verbose查看本地java环境

找到本地jre环境:

将rxtxSerial.dll添加到jre的bin目录下:

1.3将RXTXcomm.jar添加到jre的lib下的ext目录下:

至此已完成本地资源的下载

2.将RXTXcomm.jar 和 log4j 依赖的 jar 包(jar文件夹内)加入到项目中:

3.将此模块编译成的 simple_serial_port.jar 加入到你的项目中,或者直接将该项目源码作为依赖库引入你的项目中

二.使用

1.查找可用串口

ArrayList<String> ports = SerialTool.findPort();

2.打开上面找到的串口

// 第一个参数用于给 serialPortVo 指定一个名字,便于识别不同的 serialPortVo ,可通过 serialPortVo.getName() 获取
// 打开上一步骤找到了串口集合中的第一个串口,可根据需求更改
SerialPortVo serialPortVo = SerialTool.openPort("我是dtu的串口", ports.get(0), baudRate);

3.新建监听器继承 PortListener 父类并重写 onReceive() 和 onReadException() 方法,当串口接收到数据自动调用 onReceive() 方法,当接收数据时发生异常将调用 onReadException() 方法

4.绑定监听器并给串口发送数据

代码分析:

监听串口事件,特别是当串口有数据可用时,读取数据并进行后续处理。对于其他类型的串口事件(如通讯中断或错误),它会记录错误日志但没有其他操作。

  • 在 switch 语句中,根据 serialPortEvent.getEventType() 获取串口事件的类型:
    • SerialPortEvent.BI: 通讯中断,记录错误日志。
    • SerialPortEvent.OEFEPECDCTSDSRRIOUTPUT_BUFFER_EMPTY: 这些事件暂时没有特别的处理,直接 break 跳出。
    • SerialPortEvent.DATA_AVAILABLE: 串口存在可用数据,进行如下处理:
      • 通过 Thread.sleep(sleepTime) 延时一段时间,确保接收完整数据。
      • 检查 serialPortVo.getSerialPort() 是否为 null,如果是则记录错误日志。
      • 否则,调用 serialPortVo.readData() 方法读取数据,并将数据存入 byte[] data 中。
      • 最后调用 onReceive(data) 方法处理接收到的数据。
      • 如果在读取数据时发生异常,通过 onReadException(e) 处理异常情况。
    public void serialEvent(SerialPortEvent serialPortEvent) {

        switch (serialPortEvent.getEventType()) {
            case SerialPortEvent.BI: // 10 通讯中断
                logger.error("与串口设备通讯中断");
                break;
            case SerialPortEvent.OE: // 7 溢位(溢出)错误
            case SerialPortEvent.FE: // 9 帧错误
            case SerialPortEvent.PE: // 8 奇偶校验错误
            case SerialPortEvent.CD: // 6 载波检测
            case SerialPortEvent.CTS: // 3 清除待发送数据
            case SerialPortEvent.DSR: // 4 待发送数据准备好了
            case SerialPortEvent.RI: // 5 振铃指示
            case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2 输出缓冲区已清空
                break;
            case SerialPortEvent.DATA_AVAILABLE: // 1 串口存在可用数据
                try {
                    // 延时收到字符串一段时间,足够接收所有字节,以免出现字符串隔断
                    Thread.sleep(sleepTime);
                    byte[] data = null;
                    if (serialPortVo.getSerialPort() == null) {
                        logger.error("\n串口对象为空!监听失败!");
                    } else {
                        data = serialPortVo.readData(); // 读取数据,存入字节数组
                        onReceive(data);
                    }
                } catch (Exception e) {
                    onReadException(e);
                }
                break;
        }
    }

代码分析:

主要作用是:

  • 查找系统中的串口并列出。
  • 打开指定的串口,并将一个自定义的串口监听器绑定到串口上。
  • 这些操作都是串口通信中常见的基本步骤,用于与外部串口设备进行数据交互。
  • 导入依赖

     

    java复制代码

    import java.util.ArrayList;
    • 导入 ArrayList 类,用于存储查找到的串口列表。
  • 主方法

     

    java复制代码

    public static void main(String[] args) throws SerialPortParameterFailure, PortInUse, NotASerialPort, NoSuchPort, TooManyListeners, SendDataToSerialPortFailure, SerialPortOutputStreamCloseFailure {
    • main 方法是程序的入口点,抛出了多个异常,表明程序中可能涉及串口操作的异常处理。
  • 查找可用串口

     

    java复制代码

    ArrayList<String> ports = SerialTool.findPort(); System.out.println(ports);
    • SerialTool.findPort() 是一个自定义的方法,可能是用来查找当前系统中可用的串口,并将它们以字符串形式存储在 ArrayList 中。
    • System.out.println(ports); 打印出找到的串口列表,便于调试和确认。
  • 打开指定串口

     

    java复制代码

    SerialPortVo serialPortVo = SerialTool.openPort("我是dtu的串口", ports.get(1), 9600);
    • SerialTool.openPort() 方法的作用是打开指定名称的串口,传入参数包括串口名称、串口地址(可能是系统分配的串口号)、波特率(这里是 9600)。
    • 返回一个 SerialPortVo 对象,可能是封装了串口操作的工具类或者实体类。
  • 绑定串口监听器

     

    java复制代码

    serialPortVo.bindListener(new MyListener(), 500);
    • serialPortVo.bindListener() 方法用于将自定义的串口监听器 MyListener 绑定到打开的串口上,并设置超时时间为 500 毫秒。
  • 打印调试信息

     

    java复制代码

    System.out.println("h1"); System.out.println("h2");
    • 打印两条调试信息,用于确认程序运行到了哪个步骤。
  • 发送数据(被注释掉的代码)

     

    java复制代码

    //String reply = "我是在监听器类外面给你发送的消息"; //serialPortVo.sendData(reply.getBytes());
    • 这部分代码被注释掉了,原本用于向串口发送数据。reply.getBytes() 将字符串转换为字节数组发送给串口。
    public static void main(String[] args) throws SerialPortParameterFailure, PortInUse, NotASerialPort, NoSuchPort, TooManyListeners, SendDataToSerialPortFailure, SerialPortOutputStreamCloseFailure {
        //System.setProperty("spring.devtools.restart.enabled", "false");
        ArrayList<String> ports = SerialTool.findPort();
        System.out.println(ports);
        SerialPortVo serialPortVo = SerialTool.openPort("我是dtu的串口", ports.get(1), 9600);
        System.out.println("h1");
        serialPortVo.bindListener(new MyListener(), 500);
        System.out.println("h2");
        //String reply = "我是在监听器类外面给你发送的消息";
        //serialPortVo.sendData(reply.getBytes());
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值