Java串口通信——RXTX

1.前期准备

  a.配置 RXTX

    1)下载 RXTX 包并解压,网址:http://fizzed.com/oss/rxtx-for-java

    2)拷贝动态库到对应的jdk目录下

      ·Windows平台

        拷贝  rxtxSerial.dll ---> <JAVA_HOME>\jre\bin
        拷贝  rxtxParallel.dll ---> <JAVA_HOME>\jre\bin

      ·Linux平台

        拷贝  librxtxSerial.so ---> <JAVA_HOME>/jre/lib/i386/
        拷贝  librxtxParallel.so ---> <JAVA_HOME>/jre/lib/i386/

    3)在工程根目录下创建 lib 文件夹(与src平级),将 RXTXcomm.jar 放入该文件夹中

    4)在 pom.xml 中引入本地 jar 包依赖

  <dependencies>

    ......

    <dependency>
      <groupId>gnu.io</groupId>
      <artifactId>RXTXcomm</artifactId>
      <scope>system</scope>
      <systemPath>${project.basedir}/lib/RXTXcomm.jar</systemPath>
    </dependency>
  </dependencies>

  b.安装虚拟串口驱动:vspd (收费,有破解版)

  c.安装串口调试工具:Serial Port Utility (免费)

2.使用

  a.新建串口VO类

public class SerialVo {

    /**
     * 串口名称(COM0、COM1、COM2等等)
     */
    private String serialPortName;
    /**
     * 波特率
     * 默认:115200
     */
    private int baudRate;
    /**
     * 数据位 默认8位
     * 可以设置的值:SerialPort.DATABITS_5、SerialPort.DATABITS_6、SerialPort.DATABITS_7、SerialPort.DATABITS_8
     * 默认:SerialPort.DATABITS_8
     */
    private int dataBits;
    /**
     * 停止位
     * 可以设置的值:SerialPort.STOPBITS_1、SerialPort.STOPBITS_2、SerialPort.STOPBITS_1_5
     * 默认:SerialPort.STOPBITS_1
     */
    private int stopBits;
    /**
     * 校验位
     * 可以设置的值:SerialPort.PARITY_NONE、SerialPort.PARITY_ODD、SerialPort.PARITY_EVEN、SerialPort.PARITY_MARK、SerialPort.PARITY_SPACE
     * 默认:SerialPort.PARITY_NONE
     */
    private int parity;

    public SerialVo(String serialPortName) {
        this.serialPortName = serialPortName;
        this.baudRate = 115200;
        this.dataBits = SerialPort.DATABITS_8;
        this.stopBits = SerialPort.STOPBITS_1;
        this.parity = SerialPort.PARITY_NONE;
    }

    public SerialVo(String serialPortName, int baudRate) {
        this.serialPortName = serialPortName;
        this.baudRate = baudRate;
        this.dataBits = SerialPort.DATABITS_8;
        this.stopBits = SerialPort.STOPBITS_1;
        this.parity = SerialPort.PARITY_NONE;
    }

    public String getSerialPortName() {
        return serialPortName;
    }

    public void setSerialPortName(String serialPortName) {
        this.serialPortName = serialPortName;
    }

    public int getBaudRate() {
        return baudRate;
    }

    public void setBaudRate(int baudRate) {
        this.baudRate = baudRate;
    }

    public int getDataBits() {
        return dataBits;
    }

    public void setDataBits(int dataBits) {
        this.dataBits = dataBits;
    }

    public int getStopBits() {
        return stopBits;
    }

    public void setStopBits(int stopBits) {
        this.stopBits = stopBits;
    }

    public int getParity() {
        return parity;
    }

    public void setParity(int parity) {
        this.parity = parity;
    }
}

  b.新建串口工具类

public class SerialUtil {

    /**
     * 获得系统可用的端口名称列表(COM0、COM1、COM2等等)
     */
    public static List<String> getSerialPortList() {
        List<String> systemPorts = new ArrayList<>();
        //获得系统可用的端口
        Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();
        while (portList.hasMoreElements()) {
            String portName = portList.nextElement().getName();//获得端口的名字
            systemPorts.add(portName);
        }
        return systemPorts;
    }

    /**
     * 打开串口
     */
    public static SerialPort openSerialPort(SerialVo serialVo, int timeout) throws Exception {
        //通过端口名称得到端口
        CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(serialVo.getSerialPortName());
        //打开端口,(自定义名字,打开超时时间)
        CommPort commPort = portIdentifier.open(serialVo.getSerialPortName(), timeout);
        //判断是不是串口
        if (commPort instanceof SerialPort) {
            SerialPort serialPort = (SerialPort) commPort;
            //设置串口参数(波特率,数据位8,停止位1,校验位无)
            serialPort.setSerialPortParams(serialVo.getBaudRate(), serialVo.getDataBits(), serialVo.getStopBits(), serialVo.getParity());
            System.out.println("开启串口成功,串口名称:" + serialVo.getSerialPortName());
            return serialPort;
        } else {
            //是其他类型的端口
            throw new NoSuchPortException();
        }
    }

    /**
     * 关闭串口
     */
    public static void closeSerialPort(SerialPort serialPort) {
        if (serialPort != null) {
            serialPort.close();
            System.out.println("关闭了串口:" + serialPort.getName());
        }
    }

    /**
     * 向串口发送数据
     */
    public static void sendData(SerialPort serialPort, byte[] data) {
        OutputStream os = null;
        try {
            //获得串口的输出流
            os = serialPort.getOutputStream();
            os.write(data);
            os.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 从串口读取数据
     */
    public static byte[] readData(SerialPort serialPort) {
        InputStream is = null;
        byte[] bytes = null;
        try {
            //获得串口的输入流
            is = serialPort.getInputStream();
            //获得数据长度
            int bufflenth = is.available();
            while (bufflenth != 0) {
                //初始化byte数组
                bytes = new byte[bufflenth];
                is.read(bytes);
                bufflenth = is.available();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (is != null) {
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return bytes;
    }

    /**
     * 给串口设置监听
     */
    public static void setListenerToSerialPort(SerialPort serialPort, SerialPortEventListener listener) throws Exception {
        //给串口添加事件监听
        serialPort.addEventListener(listener);
        //串口有数据监听
        serialPort.notifyOnDataAvailable(true);
        //中断事件监听
        serialPort.notifyOnBreakInterrupt(true);
    }

}

3.调试

  a.新建测试类

public class App {

    //防止被GC回收
    private static SerialVo serialVo;

    public static void main( String[] args ) {
        //获得系统可用的端口名称
        List<String> portList = SerialUtil.getSerialPortList();
        System.out.println(portList);

        try {
            serialVo = new SerialVo("COM2");
            final SerialPort serialPort = SerialUtil.openSerialPort(serialVo, 115200);
            //启动一个线程每2s向串口发送数据,发送1000次hello
            new Thread(() -> {
                int i = 1;
                while (i < 1000) {
                    String s = "hello " + i++;
                    byte[] bytes = s.getBytes();
                    SerialUtil.sendData(serialPort, bytes);//发送数据
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
            //设置串口的listener
            SerialUtil.setListenerToSerialPort(serialPort, event -> {
                //数据通知
                if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
                    byte[] bytes = SerialUtil.readData(serialPort);
                    System.out.println("收到的数据长度:" + bytes.length);
                    System.out.println("收到的数据:" + new String(bytes));
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

  b.使用 vspd 添加两个虚拟串口 COM2 和 COM3

  c.使用 Serial Port Utility 测试串口的收发

  d.注意:vspd 添加的虚拟串口为 COM2 和 COM3,Java代码中连接的是 COM2,则 Serial Port Utility 需连接 COM3。

4.参考文章

  https://www.jianshu.com/p/7c03ad8a6139

原文地址:https://www.cnblogs.com/vettel0329/p/12201653.html

时间: 2024-10-11 16:30:42

Java串口通信——RXTX的相关文章

java 串口通信 rxtx的使用

1.到官网下载压缩文件,以rxtx-2.2pre2为例 http://fizzed.com/oss/rxtx-for-java 2.解压缩后得到文件,将RXTXcomm.jar添加到自己的java工程库里,1.右键->2.buildpath->3.config Build Path->4.libraries->5.add jars. 3.将win32文件夹下的rxtxSerial.dll文件拷贝到C:\WINDOWS\system32.

Java串口通信具体解释

序言 说到开源,恐怕非常少有人不挑大指称赞.学生通过开源码学到了知识,程序猿通过开源类库获得了别人的成功经验及可以按时完毕手头的project,商家通过开源软件赚到了钱……,总之是皆大欢喜.然而开源软件或类库的首要缺点就是大多缺乏具体的说明文档和使用的样例,或者就是软件代码随便你用,就是文档,样例和后期服务收钱.这也难怪,毕竟就像某个著名NBA球员说的那样:“我还要养家,所以千万美元下面的合同别找我谈,否则我宁可待业”.是啊,支持开源的人也要养家,收点钱也只是分.要想既不花钱又学到知识就仅仅能借

Java串口通信详解(转)

Java串口通信详解(转) 作者:denimcc 日期:2007-05-11 序言    说到开源,恐怕很少有人不挑大指称赞.学生通过开源代码学到了知识,程序员通过开源类库获得了别人的成功经验及能够按时完成手头的工程,商家通过开源软件赚到了钱……,总之是皆大欢喜.然而开源软件或类库的首要缺点就是大多缺乏详细的说明文档和使用的例子,或者就是软件代码随便你用,就是文档,例子和后期服务收钱.                                                        

java下的串口通信-RXTX

关于java实现的串口通信,使用的是开源项目RXTX,之前sun公司也有JCL项目,不过已经很久没有更新了,RXTX项目地址:点击打开,但是两个项目的API用法是一样的,只是导入的包不一样而已.简单的入门可以参照官方的wiki. 对应你的开发环境(Linux.window.Mac)下载对应的文件(下载地址),这里说下具体的安装方法,官方给的有点啰嗦,在Eclipse下使用,下载后里面的文件: RXTXcomm.jar包放到你项目的lib文件夹下,Java Builder Path---->Add

Java串口通信

以下是在64位win8系统上进行: 1.代码编译 串口通信需要下载两个连接库文件,rxtxSerial.dll,rxtxParallel.dll.网上说把这两个文件放到<JAVA_HOME>\jre\bin,但编译出错,后来我将他们放到<JAR_HOME>\bin编译就通过了,我的目录是:"C:\Program Files\Java\jre1.8.0_31\bin" 如果是创建的maven项目用以下依赖: <dependency> <group

使用Java实现简单串口通信

最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar包,由于java.comm比较老了,而且不支持64位系统,这里推荐Rxtx这个jar包(32位/64位均支持). 官方下载地址:http://fizzed.com/oss/rxtx-for-java (注:可能需要FQ才能下载) 不能FQ的童鞋,可以在这里下载: http://files.cnblo

JAVA串口通讯程序

package com.jetf.serialport; import gnu.io.CommPortIdentifier; import gnu.io.NoSuchPortException; import gnu.io.PortInUseException; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; import gnu.io.Unsuppor

Java实现RS485串口通信,发送和接收数据进行解析

最近项目有一个空气检测仪,需要得到空气检测仪的实时数据,保存到数据库当中.根据了解得到,硬件是通过rs485进行串口通讯的,需要发送16进制命令给仪器,然后通过轮询来得到数据. 需要先要下载RXTX的jar包,win64位下载地址:http://pan.baidu.com/s/1o6zLmTc):将解压后的rxtxParallel.dll和rxtxSerial.dll两个文件放在%JAVA_HOME%/jre/bin目录下,这样该包才能被正常的加载和调用. 代码如下: package com.g

Java实现串口通信的小样例

用Java实现串口通信(windows系统下),须要用到sun提供的串口包 javacomm20-win32.zip.当中要用到三个文件,配置例如以下: 1.comm.jar放置到 JAVA_HOME/jre/lib/ext; 2.win32com.dll放置到 JAVA_HOME/bin; 3.javax.comm.properties 两个地方都要放 jre/lib(也就是在JAVA目录下的jre) JAVA_HOME/jre/lib 说一下我应用的环境.电子秤称重时,计算机通过串口给称重控