Java读取串口数据,发送指令给超简单的两种方式

本文要实现的是利用java读取串口数据。

两种不同的方法,适用于所有java读取串口的情况。

读取串口数据

 方法一:使用RXTX读取串口数据

 1、下载依赖

 下载地址RXTX for Java (fizzed.com)icon-default.png?t=N7T8http://fizzed.com/oss/rxtx-for-java

百度网盘下载链接


2、将下载的依赖解压存放

可以看到在rxtx文档介绍中已经介绍了应该咋那么存放文件
rxtxParallel.dllrxtxSerial.dll
复制到 C:\Program Files\Java\jdk1.8.0_112\jre\bi

 

3、新建Java项目

RXTXcomm.jar  导入项目中。
IDEA设置:Ctrl+Shift+ALt+S——>选择Libraries——>左上角+号找到jar包所在位置添加应用。

 4、新建SerialReader


import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;

public class SerialReader {

    public static void main(String[] args) throws Exception {
        CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier("COM3");
        SerialPort serialPort = (SerialPort) portIdentifier.open("SerialReader", 2000);
        serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
        InputStream input = serialPort.getInputStream();

        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                try {
                    SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
                    Date date = new Date(System.currentTimeMillis());
                    Scanner scanner = new Scanner(input);
                    while (scanner.hasNextLine()) {
                        String line = scanner.nextLine();
                        System.out.println("串口发送: "+line+"  "+formatter.format(date));
                    }
                } catch (Exception e) {
                    System.err.println("从串口读取失败:" + e.getMessage());
                }
            }
        };

        // 每隔1秒执行一次任务x
        timer.scheduleAtFixedRate(task, 0, 1000);
    }


}

运行即可

 注意:运行时串口不得被其他软件或者硬件占用。不然读取会报错。

方法二:使用JSerialComm读取串口数据

1、引入依赖

        <dependency>
            <groupId>com.fazecast</groupId>
            <artifactId>jSerialComm</artifactId>
            <version>2.6.2</version>
        </dependency>
如果引入不进去的可以去​​​​​官网下载依赖,手动导包。

2、新建JSerialCommReader

import com.fazecast.jSerialComm.SerialPort;

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;

public class JSerialCommReader {
    public static void main(String[] args) {
        SerialPort serialPort = SerialPort.getCommPort("COM3");
        serialPort.openPort();
        serialPort.setBaudRate(9600);
        serialPort.setNumDataBits(8);
        serialPort.setNumStopBits(1);
        serialPort.setParity(SerialPort.NO_PARITY);

        InputStream input = serialPort.getInputStream();

        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                try {
                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
                    Date date = new Date(System.currentTimeMillis());
                    Scanner scanner = new Scanner(input);
                    while (scanner.hasNextLine()) {
                        String line = scanner.nextLine();
                        System.out.println("串口发送: " + line + "  " + formatter.format(date));
                    }
                } catch (Exception e) {
                    System.err.println("从串口读取失败:" + e.getMessage());
                }
            }
        };

        // 每隔1秒执行一次任务
        timer.scheduleAtFixedRate(task, 0, 1000);

        // 运行后请记得在合适的地方关闭串口连接,例如在应用程序退出时
        // serialPort.closePort();
    }
}

 运行即可

发送指令给串口

方法一 使用RXTX发送数据给串口

新建SerialWriter

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.OutputStream;

public class SerialWriter {

    public static void main(String[] args) throws Exception {
        // 调用 sendSerialData 方法发送串口数据
        sendSerialData("COM3", "hello World");
    }

    /**
     * 发送串口数据
     *
     * @param portName 串口名称
     * @param data     要发送的数据
     * @throws Exception 发送数据时可能抛出的异常
     */
    public static void sendSerialData(String portName, String data) throws Exception {
        // 获取串口标识符
        CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
        // 打开串口
        SerialPort serialPort = (SerialPort) portIdentifier.open("SerialWriter", 2000);
        // 设置串口参数
        serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
        // 获取输出流
        OutputStream output = serialPort.getOutputStream();

        // 将字符串转换为字节数组,并写入串口
        output.write(data.getBytes());

        // 关闭输出流和串口
        output.close();
        serialPort.close();
    }
}
运行即可

方法二:使用JSerialComm 发送串口数据


新建JSerialCommWriter

单个发送


import com.fazecast.jSerialComm.SerialPort;

import java.io.OutputStream;

public class JSerialCommWriter{
    public static void main(String[] args) {
        // 获取串口对象
        SerialPort serialPort = SerialPort.getCommPort("COM3");
        // 打开串口
        serialPort.openPort();
        // 设置串口参数
        serialPort.setBaudRate(9600);
        serialPort.setNumDataBits(8);
        serialPort.setNumStopBits(1);
        serialPort.setParity(SerialPort.NO_PARITY);

        try {
            // 获取串口输出流
            OutputStream output = serialPort.getOutputStream();

            // 要发送的数据
            String data = "Hello World";
            // 将数据转换为字节数组
            byte[] bytes = data.getBytes();

            // 将数据写入串口输出流
            output.write(bytes);
            // 刷新输出流,确保数据被发送到串口
            output.flush();

            System.out.println("已发送数据:" + data);
        } catch (Exception e) {
            System.err.println("发送数据失败:" + e.getMessage());
        } finally {
            // 关闭串口连接
            serialPort.closePort();
        }
    }
}
 运行即可

连续发送
import com.fazecast.jSerialComm.SerialPort;

import java.io.OutputStream;
import java.util.Scanner;

public class JSerialCommWriter {
    public static void main(String[] args) {
        // 获取串口对象
        SerialPort serialPort = SerialPort.getCommPort("COM3");
        // 打开串口
        serialPort.openPort();
        // 设置串口参数
        serialPort.setBaudRate(9600);
        serialPort.setNumDataBits(8);
        serialPort.setNumStopBits(1);
        serialPort.setParity(SerialPort.NO_PARITY);

        // 获取串口输出流
        OutputStream output = serialPort.getOutputStream();
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要发送的数据:");

        // 不断读取用户输入并发送到串口
        while (true) {
            // 读取用户输入
            String input = scanner.nextLine();
            if (input.equalsIgnoreCase("exit")) {
                break;
            }

            try {
                // 将输入的数据转换为字节数组
                byte[] data = input.getBytes();
                // 将数据写入串口输出流
                output.write(data);
                // 刷新输出流,确保数据被发送到串口
                output.flush();
                System.out.println("已发送数据:" + input);
            } catch (Exception e) {
                System.err.println("发送数据失败:" + e.getMessage());
            }
        }

        // 关闭串口连接
        serialPort.closePort();
    }
}
运行即可

区别:

RXTX 和 jSerialComm 都是用于在Java中进行串口通信的库,它们有一些区别和特点,下面我将详细比较这两个库:

1、平台支持:

  • RXTX:RXTX 是一个用于串口通信的开源库,它支持多种平台,包括Windows、Linux、Mac等。然而,由于RXTX的维护相对较少,可能需要一些配置和调整才能在不同平台上正常工作。
  • jSerialComm:jSerialComm 是一个用于串口通信的现代化开源库,它也支持多种平台,包括Windows、Linux、Mac等,并且相对容易配置,跨平台性能更好。

2、易用性:

  • RXTX:
    • RXTX 的API相对较复杂,需要开发者更多的代码来设置和管理串口通信。
    • 通过 RXTX,您需要手动配置串口参数,如波特率、数据位、停止位和校验位。
    • 数据的读取和写入需要更多的低级别操作,例如使用流。
  • jSerialComm:
    • jSerialComm 提供了更简单、更直观的API,易于使用。
    • 它抽象了串口通信的许多细节,提供了更高级别的接口来处理串口通信,例如SerialPortSerialPortEvent

3、活跃性和维护:

  • RXTX:RXTX 在一段时间内没有太多活跃性,开发和维护相对较慢。新的Java版本可能会导致兼容性问题。
  • jSerialComm:jSerialComm 相对较新,但活跃性较高,维护频繁。它会更及时地适应新的Java版本,并修复可能出现的问题。

4、性能:

  • RXTX:RXTX 在性能上表现良好,可以处理高速的串口通信,适合需要高吞吐量的应用。
  • jSerialComm:jSerialComm 在性能上表现也很不错,能够满足大多数串口通信需求,尤其适用于一般用途。

5、许可证:

  • RXTX:RXTX 使用GNU通用公共许可证(GPL),这可能会限制其在某些商业项目中的使用。
  • jSerialComm:jSerialComm 使用更宽松的MIT许可证,更适合在商业项目中使用。

总的来说,jSerialComm 在易用性、跨平台性和维护活跃性方面更有优势,特别适用于一般用途的串口通信。如果您需要更高性能的串口通信或有特殊需求,RXTX也是一个可选的选择,但需要更多的配置和处理。但需要注意的是,由于RXTX的维护相对较慢,建议在新项目中考虑使用jSerialComm。

下篇给大家分享如何利用websocket将串口数据进行传输

Java通过WebSocket读取传输串口数据

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值