环境:Windows10,Eclipse4.5.2,JDK1.7
设备:DS18B20温度传感器(4线,485接口),USB转485接口转换器,笔记本电脑
注意点:RTU传输,使用的是字节,那么在程序中常会遇到传给设备的字节无法用byte表示,可能会溢出(例如校验值),所以也可以用int值传入,效果相同。
MyTwoWaySerialComm.java [核心类]
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Scanner;
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
/**
* 双向串行通信类
* @author 都颜汗
*
*/
public class MyTwoWaySerialComm {
/**
* 端口连接
* @param portName
* @throws Exception
*/
void connect(String portName) throws Exception {
// 通过端口名获取端口标志对象
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
// 检测当前端口是否已有所属(即检测是否被占用)
boolean isOwned = portIdentifier.isCurrentlyOwned();
// 若已经被占用
if(isOwned)
{
System.out.println("当前端口已经被占用");
}
// 若当前端口可用
else {
// 打开通信端口 (注意:这里使用应用名,和打开超时时间,单位ms),打开后获取通信端口对象
CommPort commPort = portIdentifier.open(this.getClass().getName(), 2000);
// 判断当前这个端口对象commPort是否是串行端口类的对象,注意:这里如果没有获取到commPort对象 一样会返回false
if(commPort instanceof SerialPort)
{
// 如果是串行端口(电脑上除了串行端口,还有并行