java实现串口通讯

此文章是基于   搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台

一. 准备工作

  1. 将RXTXcomm.jar放到  %JAVA_HOME%jrelibext  目录下

  2. 将rxtxSerial.dll放到  %JAVA_HOME%jrein  目录下

  

二. 相关程序介绍

  1. CommPort.java,串口类

package com.ims.interfaces.commPort;

public class CommPort {
    /**
     * 串口名称,如:COM1、COM2
     */
    private String commPortName="";           
    
    /**
     * 串口所有者名称,一般为应用程序的名称
     */
    private String ownerName;                 
    
    /**
     * 波特率
     */
    private String baudRate="";               
    
    /**
     * 数据位
     */
    private String dataBit="";                
    
    /**
     * 校验位
     */
    private String partityBit="";             
    
    /**
     * 停止位
     */
    private String stopBit="";                
    
    public String getCommPortName() {
        return commPortName;
    }

    public void setCommPortName(String commPortName) {
        this.commPortName = commPortName;
    }

    public String getOwnerName() {
        return ownerName;
    }

    public void setOwnerName(String ownerName) {
        this.ownerName = ownerName;
    }

    public String getBaudRate() {
        return baudRate;
    }

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

    public String getDataBit() {
        return dataBit;
    }

    public void setDataBit(String dataBit) {
        this.dataBit = dataBit;
    }

    public String getPartityBit() {
        return partityBit;
    }

    public void setPartityBit(String partityBit) {
        this.partityBit = partityBit;
    }

    public String getStopBit() {
        return stopBit;
    }

    public void setStopBit(String stopBit) {
        this.stopBit = stopBit;
    }
    
}
View Code

  2. CommPortManager.java,串口管理员类

package com.ims.interfaces.commPort;

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

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.Enumeration;

public class CommPortManager {
    /**
     * 串口定义
     */
    private CommPort commPort;         
    
    /**
     * 串口对象
     */
    private SerialPort serialPort;     
    
    /**
     * 字节输入
     */
    private InputStream in;               
    
    /**
     * 字节输出
     */
    private OutputStream out;          
    
    /**
     * 字符输入
     */
    private BufferedReader bufReader;  
    
    /**
     * 字符输出
     */
    private BufferedWriter bufWriter;  
    
    /**
     * 数据输入
     */
    private DataInputStream dataIn;    
    
    /**
     * 数据输出
     */
    private DataOutputStream dataOut;  
    
    /**
     * 串口是否在使用
     */
    private boolean isUse;             
    
    public CommPortManager(CommPort commPort){
        this.commPort = commPort;
    }
    
    /**
     * 打开串口
     * @throws Exception
     */
    public void open() throws Exception{
        CommPortIdentifier commPortId = CommPortIdentifier.getPortIdentifier(commPort.getCommPortName());
        
        // 第一个参数:通常设置为你的应用程序的名字;第二个参数:开启端口超时的毫秒数
        serialPort = (SerialPort)commPortId.open(commPort.getOwnerName(), 5000);
        serialPort.setOutputBufferSize(2048);
        
        in = serialPort.getInputStream();
        out = serialPort.getOutputStream();        
        
        bufReader = new BufferedReader(new InputStreamReader(in, "Unicode"));
        bufWriter = new BufferedWriter(new OutputStreamWriter(out));
        
        dataIn = new DataInputStream(in);
        dataOut = new DataOutputStream(out);
        
        // 设置串口参数
        serialPort.setSerialPortParams(Integer.valueOf(commPort.getBaudRate()), Integer.valueOf(commPort.getDataBit()), 
                Integer.valueOf(commPort.getStopBit()), Integer.valueOf(commPort.getPartityBit()));
    }
    
    /**
     * 判断串口是否可用
     */
    public boolean commPortEnable(){    
        boolean result = false;
        Enumeration en = CommPortIdentifier.getPortIdentifiers();
        while (en.hasMoreElements()) {             
            CommPortIdentifier portId = (CommPortIdentifier) en.nextElement();
            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL
                    && portId.getName().equalsIgnoreCase(commPort.getCommPortName())) {
                result = true;
            }
        }
        return result;
    }

    /**
     * 设置串口接收超时时间
     * @param timeout 超时时间,单位秒
     * @throws Exception
     */
    public void setReceiveTimeout(int timeout) throws Exception{
        getSerialPort().enableReceiveTimeout(timeout*1000);
    }
    
    public CommPort getCommPort() {
        return commPort;
    }

    public SerialPort getSerialPort() {
        return serialPort;
    }

    public InputStream getIn() {
        return in;
    }

    public OutputStream getOut() {
        return out;
    }

    public BufferedReader getBufReader() {
        return bufReader;
    }

    public BufferedWriter getBufWriter() {
        return bufWriter;
    }

    public DataInputStream getDataIn() {
        return dataIn;
    }

    public DataOutputStream getDataOut() {
        return dataOut;
    }

    public boolean isUse() {
        return isUse;
    }

    public void setUse(boolean isUse) {
        this.isUse = isUse;
    }
}
View Code
原文地址:https://www.cnblogs.com/Mr-kevin/p/5776353.html