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");
}
});
}
}
}