java通信com口

1,884 阅读1分钟

1.环境搭建

系统:windows10

jdk版本:jdk8

开发工具:idea

jar:

        <dependency>
            <groupId>com.fazecast</groupId>
            <artifactId>jSerialComm</artifactId>
            <version>[2.0.0,3.0.0)</version>
        </dependency>

jSerialComm地址: github.com/Fazecast/jS…

2.实现目标

使用java在windows平台上对com口进行通信,要求java端向com端发送信息,com端回复信息整个流程下来,有超时.

3.实现思路

java通信com口之前有一个解决方案:rxtx .不过rxtx已经很久没有维护了,且使用的是bio流,若通讯中间发生任何问题,就会无限期的阻塞在那里,解决方案:用另一个线程去盯着,都9102年了,这样的解决方法太麻烦了,后来在gayhub上看到了jSerialComm,拥有bio的方法.

4.代码

注意:comPort.setComPortTimeouts中的超时,仅在windows下有效

测试向com发送信息

测试收到com的信息

package com.jserialcomm.demo.player;

import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;

/**
 * @Description:
 * @ClassName:jSerialComm
 * @Author:Player
 * @Date:2019-05-20 10:40
 **/
public class jSerialComm {
    public static void main(String[] args) {
        //writeTest();
        //snyReturnData();

    }

    /*
     *  测试向com口发送数据
    * */
    private static void writeTest(){
        SerialPort comPort = SerialPort.getCommPorts()[0];
        comPort.openPort();
        comPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING,10000,100000);
        String string="0000";
        comPort.writeBytes(string.getBytes(),string.getBytes().length);
    }
    /*
    测试收到数据
    * */
    private static void snyReturnData(){
        SerialPort comPort = SerialPort.getCommPorts()[0];
        comPort.openPort();
        comPort.addDataListener(new SerialPortDataListener() {
            @Override
            public int getListeningEvents() { return SerialPort.LISTENING_EVENT_DATA_RECEIVED; }
            @Override
            public void serialEvent(SerialPortEvent event)
            {
                byte[] newData = event.getReceivedData();
                System.out.println("Received data of size: " + newData.length);
                for (int i = 0; i < newData.length; ++i)
                    System.out.print((char)newData[i]);
                System.out.println("\n");
            }
        });
    }


}


}