JAVA进行串口开发,简单直接

Java要进行串口开发,不多bb直接开始把。先要有思路

1,我们现在很多笔记本或者电脑是没有串口的,所以你要先确定你的电脑上是不是又串口

2,没有串口也不用着急,又usb接口就可以读写串口,因为有个东西叫做usb转串口的一个线

3,当然要用java读取电脑的硬件(串口),肯定也少不了jar包的支持

4,但凡涉及到数据的交互的,都离不开输入输出流这个东西。

所以总结一下大概就是,先找个串口连接到自己的电脑上,如果电脑上没有串口孔,那就买个usb转串口设备,

连接到电脑上后,然后下个jar包。下载地址:点击打开链接 这个是我在网上找的应该是官网的下载地址,如果

觉得英文麻烦,那么你也可以在网上搜,很多需要十多个积分的下载的地址去下吧,反正都一样。

好吧,都整好了,

拷贝 RXTXcomm.jar 到 JAVA_HOME\jre\lib\ext目录中; 

拷贝 rxtxSerial.dll 到 JAVA_HOME\jre\bin目录中; 

拷贝 rxtxParallel.dll 到 JAVA_HOME\jre\bin目录中; 

JAVA_HOME为jdk安装路径

好!到这儿环境就已经好了 ,串口开发需要的外部东西已经准备好了,接下来就是代码copy开始了

package com.stylefeng.guns.modular.RDT_data.utils; /**
 * @ClassName ThrClass
 * @Description TODO
 * @EMAIL [email protected]
 * @DATE 2018/6/312:16
 * @Version 1.0
 */

import com.alibaba.fastjson.JSONObject;
import gnu.io.*;
import org.omg.Messaging.SYNC_WITH_TRANSPORT;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.imageio.ImageIO;
import javax.imageio.stream.FileImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.*;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.TooManyListenersException;

public class RdtBaseUtil implements SerialPortEventListener {
   
    protected static CommPortIdentifier portid = null;  //通讯端口标识符
    protected static SerialPort comPort = null;         //串行端口
    protected int BAUD = 115200;  //波特率
    protected int DATABITS = SerialPort.DATABITS_8;
    ;  //数据位
    protected int STOPBITS = SerialPort.STOPBITS_1;  //停止位
    protected int PARITY = SerialPort.PARITY_NONE;  //奇偶检验
    public static OutputStream oStream;    //输出流
    public static InputStream iStream;     //输入流

    /**
     * 读取所有串口名字
     */
    private void listPortChoices() {
        CommPortIdentifier portId;
        Enumeration en = CommPortIdentifier.getPortIdentifiers();
        // iterate through the ports.
        while (en.hasMoreElements()) {
            portId = (CommPortIdentifier) en.nextElement();
            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                System.out.println(portId.getName());
            }
        }
    }

    /**
     * 设置串口号
     *
     * @param
     * @return
     */
    public void setSerialPortNumber() {

        String osName = null;
        String osname = System.getProperty("os.name", "").toLowerCase();
        if (osname.startsWith("windows")) {
            // windows
            osName = "COM3";
        } else if (osname.startsWith("linux")) {
            // linux
            osName = "/dev/ttyS1";
        }
        System.out.println(osName);
        try {
            portid = CommPortIdentifier.getPortIdentifier(osName);
            // portid = CommPortIdentifier.getPortIdentifier(Port);
            if (portid.isCurrentlyOwned()) {
                System.out.println("端口在使用");
            } else {
                comPort = (SerialPort) portid.open(this.getClass().getName(), 1000);
            }
        } catch (PortInUseException e) {
            System.out.println("端口被占用");
            e.printStackTrace();

        } catch (NoSuchPortException e) {
            System.out.println("端口不存在");
            e.printStackTrace();
        }

        try {
            iStream = comPort.getInputStream(); //从COM1获取数据
            oStream = comPort.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }


        try {
            comPort.addEventListener(this);       //给当前串口增加一个监听器
            comPort.notifyOnDataAvailable(true);  //当有数据是通知
        } catch (TooManyListenersException e) {
            e.printStackTrace();
        }

        try {
            //设置串口参数依次为(波特率,数据位,停止位,奇偶检验)
            comPort.setSerialPortParams(this.BAUD, this.DATABITS, this.STOPBITS, this.PARITY);
        } catch (UnsupportedCommOperationException e) {
            System.out.println("端口操作命令不支持");
            e.printStackTrace();
        }
    }


    @Override
    public void serialEvent(SerialPortEvent event) {
        switch (event.getEventType()) {
            case SerialPortEvent.BI:
            case SerialPortEvent.OE:
            case SerialPortEvent.FE:
            case SerialPortEvent.PE:
            case SerialPortEvent.CD:
            case SerialPortEvent.CTS:
            case SerialPortEvent.DSR:
            case SerialPortEvent.RI:
            case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
                break;
            case SerialPortEvent.DATA_AVAILABLE:// 当有可用数据时读取数据,并且给串口返回数据
                //进来后 就不是第一次了
                //TODO
                break;
        }
    }
}

上面就是大家最喜欢的部分了,拷到项目中,首先编译通过,然后运行,当然里面的参数,或者串口名称这些还是要根据实际情况修改一下,然后后面的事情,想怎么封装就怎么封装,核心就是里面的一个输入流和输出流,通过这两个流就可以和串口设备进行通信了。


猜你喜欢

转载自blog.csdn.net/l13020227067/article/details/80693087