modbus4j icon indicating copy to clipboard operation
modbus4j copied to clipboard

how to use TestSerialWrapper?

Open robbStarkTFG4 opened this issue 9 years ago • 4 comments

can you add an example showing implementation of interface SerialPortWrapper?.

robbStarkTFG4 avatar Feb 11 '16 05:02 robbStarkTFG4

Here is one that we use inside of Mango Automation.

You will also need to refer to the abstract class SerialPortProxy and one of its concrete implementations JsscSerialPortProxy

/**
 * Copyright (C) 2015 Infinite Automation Software. All rights reserved.
 * @author Terry Packer
 */
package com.infiniteautomation.mango

import java.io.InputStream;
import java.io.OutputStream;

import com.infiniteautomation.mango.io.serial.SerialPortProxy;
import com.serotonin.m2m2.Common;
import com.serotonin.modbus4j.serial.SerialPortWrapper;

/**
 * @author Terry Packer
 *
 */
public class MangoSerialPortWrapper implements SerialPortWrapper{

    private String ownerName;
    private String commPortId;
    private int baudRate;
    private int flowControlIn;
    private int flowControlOut;
    private int dataBits;
    private int stopBits;
    private int parity;

    private SerialPortProxy proxy;

    /**
     * @param ownerName
     * @param commPortId
     * @param baudRate
     * @param flowControlIn
     * @param flowControlOut
     * @param dataBits
     * @param stopBits
     * @param parity
     */
    public MangoSerialPortWrapper(String ownerName, String commPortId,
            int baudRate, int flowControlIn, int flowControlOut, int dataBits,
            int stopBits, int parity) {
        super();
        this.ownerName = ownerName;
        this.commPortId = commPortId;
        this.baudRate = baudRate;
        this.flowControlIn = flowControlIn;
        this.flowControlOut = flowControlOut;
        this.dataBits = dataBits;
        this.stopBits = stopBits;
        this.parity = parity;
    }

    /* (non-Javadoc)
     * @see com.serotonin.modbus4j.serial.SerialPortWrapper#close()
     */
    @Override
    public void close() throws Exception {
        Common.serialPortManager.close(proxy);
    }

    /* (non-Javadoc)
     * @see com.serotonin.modbus4j.serial.SerialPortWrapper#open()
     */
    @Override
    public void open() throws Exception {
        this.proxy = Common.serialPortManager.open(ownerName, commPortId, baudRate, flowControlIn, flowControlOut, dataBits, stopBits, parity);

    }

    /* (non-Javadoc)
     * @see com.serotonin.modbus4j.serial.SerialPortWrapper#getInputStream()
     */
    @Override
    public InputStream getInputStream() {
        return this.proxy.getInputStream();
    }

    /* (non-Javadoc)
     * @see com.serotonin.modbus4j.serial.SerialPortWrapper#getOutputStream()
     */
    @Override
    public OutputStream getOutputStream() {
        return this.proxy.getOutputStream();
    }

    /* (non-Javadoc)
     * @see com.serotonin.modbus4j.serial.SerialPortWrapper#getBaudRate()
     */
    @Override
    public int getBaudRate() {
        return this.baudRate;
    }

    /* (non-Javadoc)
     * @see com.serotonin.modbus4j.serial.SerialPortWrapper#getDataBits()
     */
    @Override
    public int getDataBits() {
        return this.dataBits;
    }

    /* (non-Javadoc)
     * @see com.serotonin.modbus4j.serial.SerialPortWrapper#getStopBits()
     */
    @Override
    public int getStopBits() {
        return this.stopBits;
    }

    /* (non-Javadoc)
     * @see com.serotonin.modbus4j.serial.SerialPortWrapper#getParity()
     */
    @Override
    public int getParity() {
        return this.parity;
    }

    /* (non-Javadoc)
     * @see com.serotonin.modbus4j.serial.SerialPortWrapper#getFlowControlIn()
     */
    @Override
    public int getFlowControlIn() {
        return this.flowControlIn;
    }

    /* (non-Javadoc)
     * @see com.serotonin.modbus4j.serial.SerialPortWrapper#getFlowControlOut()
     */
    @Override
    public int getFlowControlOut() {
        return this.flowControlOut;
    }

}

terrypacker avatar Feb 11 '16 05:02 terrypacker

Unfortunately, there is little documentation on this, but here's another one I created using JSSC as the underlying Port implementation.

import com.serotonin.modbus4j.serial.SerialPortWrapper;
import jssc.SerialPort;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Domenic on 12/22/2015.
 */
public class SerialPortWrapperImpl implements SerialPortWrapper {
    private static final Logger LOGGER = LoggerFactory.getLogger(SerialPortWrapperImpl.class);
    private final SerialPort port;
    private List<PortConnectionListener> listeners = new ArrayList<>();

    public void addPortConnectionListener(PortConnectionListener listener) {
        listeners.add(listener);
    }

    public SerialPortWrapperImpl(String portName) {
        port = new SerialPort(portName);
    }

    @Override
    public void close() throws Exception {
        port.closePort();
        listeners.forEach(PortConnectionListener::closed);
        LOGGER.debug("serial port " + port.getPortName() + " is closed");
    }

    @Override
    public void open() throws Exception {
        port.openPort();
        port.setParams(this.getBaudRate(), this.getDataBits(), this.getStopBits(), this.getParity());
        port.setFlowControlMode(this.getFlowControlIn() | this.getFlowControlOut());

        listeners.forEach(PortConnectionListener::opened);
        LOGGER.debug("serial port " + port.getPortName() + " is open");
    }

    @Override
    public InputStream getInputStream() {
        return new SerialInputStream(port);
    }

    @Override
    public OutputStream getOutputStream() {
        return new SerialOutputStream(port);
    }

    @Override
    public int getBaudRate() {
        return SerialPort.BAUDRATE_9600;
    }

    @Override
    public int getFlowControlIn() {
        return SerialPort.FLOWCONTROL_NONE;
    }

    @Override
    public int getFlowControlOut() {
        return SerialPort.FLOWCONTROL_NONE;
    }

    @Override
    public int getDataBits() {
        return SerialPort.DATABITS_8;
    }

    @Override
    public int getStopBits() {
        return SerialPort.STOPBITS_1;
    }

    @Override
    public int getParity() {
        return SerialPort.PARITY_NONE;
    }
}

djdenv avatar Feb 11 '16 14:02 djdenv

hi. i am using rs232 interface with rs485 converter ic and i need to down rts pin. do you know how i can do this with jSerialComm library and why you wrote both getflowcontrol override functions flowcontrol_none ?

cevatbostancioglu avatar Dec 19 '16 06:12 cevatbostancioglu

本人小白一个 ,有什么不完善的地方希望大家可以指出,以下只是我自己的做法。 首先,你需要下载一个额外的支持Java串口通信操作的jar包。 地址: http://files.cnblogs.com/files/Dreamer-1/mfz-rxtx-2.2-20081207-win-x86.zip(32位)

http://files.cnblogs.com/files/Dreamer-1/mfz-rxtx-2.2-20081207-win-x64.zip (64位)

.dll文件放在jdk路径下(xx\jre\bin) .jar 文件导入项目 具体操作参考: http://www.cnblogs.com/Dreamer-1/p/5523046.html

接下来是我的 SerialPortWrapper 实现类

package com.serotonin.modbus4j.test.mytest;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import com.serotonin.modbus4j.serial.SerialPortWrapper;
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

/**
 * 
 * This class is not finished
 * 
 * @author Terry Packer
 *
 */
public class SerialPortWrapperImpl implements SerialPortWrapper {
	private SerialPort serialPort;
	private String commPortId;
	private int baudRate;
	private int flowControlIn;
	private int flowControlOut;
	private int dataBits;
	private int stopBits;
	private int parity;

	public SerialPortWrapperImpl() {
		super();
	}

	public SerialPortWrapperImpl(String commPortId, int baudRate, int flowControlIn, int flowControlOut, int dataBits,
			int stopBits, int parity) {
		this.commPortId = commPortId;
		this.baudRate = baudRate;
		this.flowControlIn = flowControlIn;
		this.flowControlOut = flowControlOut;
		this.dataBits = dataBits;
		this.stopBits = stopBits;
		this.parity = parity;
	}

	public String getCommPortId() {
		return commPortId;
	}

	public void setCommPortId(String commPortId) {
		this.commPortId = commPortId;
	}

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

	public void setFlowControlIn(int flowControlIn) {
		this.flowControlIn = flowControlIn;
	}

	public void setFlowControlOut(int flowControlOut) {
		this.flowControlOut = flowControlOut;
	}

	public void setDataBits(int dataBits) {
		this.dataBits = dataBits;
	}

	public void setStopBits(int stopBits) {
		this.stopBits = stopBits;
	}

	public void setParity(int parity) {
		this.parity = parity;
	}

	@Override
	public void close() throws Exception {
		if (serialPort != null) {
			serialPort.close();
			serialPort = null;
		}
	}

	@Override
	public void open() throws Exception {
		System.out.println(commPortId);
		CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(commPortId);
		// 打开端口,并给端口名字和一个timeout(打开操作的超时时间)
		System.out.println(commPortId);
		CommPort commPort = portIdentifier.open(commPortId, 2000);
		// 判断是不是串口
		if (commPort instanceof SerialPort) {
			serialPort = (SerialPort) commPort;
			try {
				// 设置一下串口的波特率等参数
				// serialPort.setSerialPortParams(baudRate,
				// SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
				// SerialPort.PARITY_NONE);
			} catch (Exception e) {
				e.printStackTrace();
			}
			// System.out.println("Open " + portName + " sucessfully !");
			// return serialPort;
		} else {
			// 不是串口
			System.out.println("不是串口");
		}

	}
	@Override
	public InputStream getInputStream() {
		InputStream in = null;
		try {
			in = serialPort.getInputStream();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return in;
	}
	@Override
	public OutputStream getOutputStream() {
		OutputStream out = null;
		try {
			out = serialPort.getOutputStream();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return out;
	}
	@Override
	public int getBaudRate() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int getStopBits() {
		// TODO Auto-generated method stub
		return this.stopBits;
	}

	@Override
	public int getParity() {
		// TODO Auto-generated method stub
		return this.parity;
	}

	@Override
	public int getFlowControlIn() {
		// TODO Auto-generated method stub
		return this.flowControlIn;
	}
	@Override
	public int getFlowControlOut() {
		// TODO Auto-generated method stub
		return this.flowControlOut;
	}
	@Override
	public int getDataBits() {
		// TODO Auto-generated method stub
		return this.dataBits;
	}

}

BY:一只等待星期五的沙皮狗

SharPeiDog avatar Jul 13 '17 06:07 SharPeiDog