java串口通信

Rxtx开源包下载地址:http://mfizz.com/oss/rxtx-for-java
windows平台使用方法:
1、把rxtxParallel.dll、rxtxSerial.dll拷贝到:C:\WINDOWS\system32下。
2、如果是在开发的时候(JDK),需要把RXTXcomm.jar拷贝到..\jre…\lib\ext下;将rxtxParallel.dll、rxtxSerial.dll 拷贝到..\jre…\bin下;如:D:\Program Files\java\jre1.8.0_111\lib\ext
3、java,需要导入RXTXcomm.jar包

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
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 SerialUtil implements SerialPortEventListener{

    public int timeout = 6; // 超时时间  
    public String port = "COM1"; // 端口名称  
    public int dataBits = 8; // 数据位  
    public int stopBits = 1; // 停止位  
    public int parity = 0; // 奇偶校验  
    public int rate = 38400; // 波特率  

    private SerialPort serialPort; 
    boolean isOpen = false; // 端口状态:打开或关闭

   // static byte[] openJoin12 = new byte[] { 0xFE, 0x03, 0x21, 0x30,  0xFF,  0xFC,
    //      0x12, 0x03 }; // 开启 12S 允许加网指令
   // static byte[] makeNet = new byte[] { 0xFE, 0x00, 0x21, 0x31, 0x10}; // 终端串口发送组网指令

    public SerialUtil() {
        listPortChoices();
        //getPortStatus();
        open();
        sendData("hi");
        sendData("");
        //getPortStatus();
        //close();
        //getPortStatus();
    }

    public void getPortStatus() {
        if(isOpen) {
            System.out.println("端口已打开");
        } else {
            System.out.println("端口已关闭");
        }
    }

    // 读取所有串口名字
    public void listPortChoices() {
        CommPortIdentifier portId;
        Enumeration en = CommPortIdentifier.getPortIdentifiers();
        while (en.hasMoreElements()) {
            portId = (CommPortIdentifier) en.nextElement();
            System.out.println("port: "+ portId.getName() + " : " + portId.getPortType());
//          if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { // 只得到com串口
//              System.out.println(portId.getName());
//          }
        }
    }

    // 打开串口
    public void open() {
        try {
            CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(port);
            serialPort = (SerialPort) portId.open("controller", timeout);  
            //inputStream = serialPort.getInputStream(); 
            serialPort.addEventListener(this);// 增加一个监听
            serialPort.notifyOnDataAvailable(true);  
            serialPort.setSerialPortParams(rate, dataBits, stopBits, parity);  
            isOpen = true;
        } catch (NoSuchPortException e) { // 端口不存在
            e.printStackTrace();
        } catch (PortInUseException e) { // 端口已经被占用
            e.printStackTrace();
        } catch (UnsupportedCommOperationException e) { // 端口操作命令不支持
            e.printStackTrace();
        } catch (TooManyListenersException e) { // 太多的监听者
            e.printStackTrace();
        }  

    }

    // 关闭串口
    public void close() {
        if (isOpen) {  
            try {  
                serialPort.notifyOnDataAvailable(false);  
                serialPort.removeEventListener();  
                serialPort.close();  
                isOpen = false;  
            } catch (Exception e) {  
                e.printStackTrace();
            }
        }
    }

    // 向端口发送数据
    public void sendData(String data) {
        if(isOpen) {  
            try {  
                OutputStream outputStream = serialPort.getOutputStream();  
                outputStream.write(data.getBytes());  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }

    @Override
    public void serialEvent(SerialPortEvent event) {
        switch (event.getEventType()) {  
        case SerialPortEvent.BI: // 10  
        case SerialPortEvent.OE: // 7  
        case SerialPortEvent.FE: // 9  
        case SerialPortEvent.PE: // 8  
        case SerialPortEvent.CD: // 6  
        case SerialPortEvent.CTS: // 3  
        case SerialPortEvent.DSR: // 4  
        case SerialPortEvent.RI: // 5  
        case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2  
            break;  
        case SerialPortEvent.DATA_AVAILABLE: // 1  
            try {  
                // 多次读取,将所有数据读入  
                byte[] readBuffer = new byte[1000];  
                InputStream inputStream = serialPort.getInputStream();  
                while (inputStream.available() > 0) {  
                    inputStream.read(readBuffer);  
                }  
                System.out.println(new String(readBuffer));  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
            break;  
        }  
    }

    public static void main(String[] args) {
        SerialUtil su = new SerialUtil();
    }

}

猜你喜欢

转载自blog.csdn.net/summerSunStart/article/details/79769457