java读取串口数据

这是我的毕业设计,要求是将电脑串口(USB)接收到的数据打包上传到互联网,花了几天时间了解了java读取串口和制作图形界面的方法,做了一个小程序实现了这个功能,这里只是简单记录一下java读取串口的方法。

首先查到java读取串口数据,需要下载一个叫javacomm20-win32的包,这个 包是官方提供的,已经过时了,看名字也知道只支持32位的系统。由于是64位系统的电脑,几番搜寻后发现了一个叫RXTX的扩展包,支持Linux,mac,Win32,和Win64,这个类继承自javax.comm,所以下载进行配置后就可以像使用javax.comm一样进行使用串口了。下载地址为:http://rxtx.qbang.org/pub/rxtx/

  • 注意,下载 rxtx-2.2pre1-bins.zip 这个文件,其他版本会报错或者不支持Win64。

下载完成解压后就可以看到各个版本的文件夹了,选择相应的版本进入,如我是64位Win10,就进入win64的文件夹,复制rxtxSerial.dll文件到jre目录\bin 文件夹,我的jre目录在C盘,所以我要复制到:C:\Program Files\Java\jre8\bin 里面。完成过后再将外面的 RXTXcomm.jar 文件复制到 jre目录\lib\ext文件夹里面。

完成以后就可以进行java串口的开发了,先新建一个class,代码如下:

package com;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.TooManyListenersException;

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.UnsupportedCommOperationException;

public class SerialBean implements SerialPortEventListener {
    private static String PortName;
    private static CommPortIdentifier portId;
    private static SerialPort serialPort;
    private static OutputStream out;
    private static InputStream in;

    public static int baud = 115200;

    public SerialBean(String com, int baud) {
        SerialBean.PortName = com;
        SerialBean.baud = baud;
    }

    // 初始化串口,将输入流返回用于事件读取
    public void Initialize() {
        try {
            portId = CommPortIdentifier.getPortIdentifier(PortName);
            // 由对象打开串口,并为串口命名
            serialPort = (SerialPort) portId.open("JAVA_SERIAL", 2000);
            // 注册一个SerialPortEventListener事件来监听串口事件
            serialPort.addEventListener(this);
            // 数据可用则触发事件
            serialPort.notifyOnDataAvailable(true);
            // 打开输入输出流
            in = serialPort.getInputStream();
            out = serialPort.getOutputStream();
            // 设置串口参数,波特率115200,8位数据位,1位停止位,无奇偶校验
            serialPort.setSerialPortParams(baud, SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);

        } catch (PortInUseException e) {
            System.out.println("该串口正在使用中");
        } catch (NoSuchPortException e) {
            System.out.println("该串口当前不可使用");
        } catch (UnsupportedCommOperationException e) {
            System.out.println("错误的串口参数配置");
        } catch (TooManyListenersException e) {
            System.out.println("该串口已存在监听器");
        } catch (IOException e) {
            System.out.println("输入输出流打开失败");
        }
    }

    // 关闭串口
    public void ClosePort() {
        serialPort.close();
    }

    // 监听串口事件
    @Override
    public void serialEvent(SerialPortEvent event) {
        switch (event.getEventType()) {
        case SerialPortEvent.BI://Break interrupt,通讯中断
        case SerialPortEvent.OE://Overrun error,溢位错误 
        case SerialPortEvent.FE://Framing error,传帧错误 
        case SerialPortEvent.PE://Parity error,校验错误 
        case SerialPortEvent.CD://Carrier detect,载波检测 
        case SerialPortEvent.CTS://Clear to send,清除发送 
        case SerialPortEvent.DSR:// Data set ready,数据设备就绪 
        case SerialPortEvent.RI://Ring indicator,响铃指示 
        case SerialPortEvent.OUTPUT_BUFFER_EMPTY:// Output buffer is empty,输出缓冲区清空
            break;
        case SerialPortEvent.DATA_AVAILABLE://Data available at the serial port,端口有可用数据。读到缓冲数组,输出到终端                        
            String r = "";
            int c;
            try {

                if (in != null) {
                    while (in.available() > 0) {
                        c = in.read();
                        Character d = new Character((char) c);
                        r = r.concat(d.toString());
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.print(r);
            break;
        }
    }
}

这个程序只能进行串口读取,串口读取的操作需要注册事件,当串口有数据时触发函数serialEvent,然后再对接收到的数据进行处理,主要是对字符串进行一个拼接操作。主方法中只需要进行串口的初始化操作即可。主方法如下:

package com;
import java.io.IOException;
import java.util.Enumeration;   
import gnu.io.*;  

public class SerialCom { 
    public static void main(String[] args) {
        //打开串口3
        SerialBean serialBean = new SerialBean("COM3", 115200);
        serialBean.Initialize();
    }   
    public static void listPortChoices() {   
        CommPortIdentifier portId;   
        Enumeration en = CommPortIdentifier.getPortIdentifiers();   
        // iterate through the ports.   
        while (en.hasMoreElements()) {   
            portId = (CommPortIdentifier) en.nextElement();  
            System.out.println("当前可用串口:");
            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {   
                System.out.println(portId.getName());   
            }   
        }   
    }   
}  

listPortChoices()函数并没有使用,这个函数可以输出当前电脑上的可用串口。构造SerialBean对象时,输入的COM3115200分别表示端口号和所使用的波特率,由所连接的设备决定,我这里是由一个单片机通过USB转串口模块与电脑连接,单片机串口波特率为115200,USB转串口模块被电脑分配到COM3口。

猜你喜欢

转载自blog.csdn.net/egean/article/details/53038450
今日推荐