0
votes
package deviceintegration;
import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;
/**
 *
 *
 */
public class SerialScaleDevice implements SerialPortEventListener {
    private String m_sPortScale;
    private SerialPort m_CommSerialPort;
    private static final int SCALE_READY = 0;
    private String m_dWeight;
    private int m_iStatusScale;
    /**
     * Creates a new instance of SerialScaleDevice
     * 
     * @param sPortPrinter
     */
    public SerialScaleDevice(String sPortPrinter) {
        m_sPortScale = sPortPrinter;
        m_CommSerialPort = new SerialPort(m_sPortScale);
        //
        m_iStatusScale = SCALE_READY;
        m_dWeight = "";
    }
    /**
     *
     * @return
     */
    public String readWeight() {
        synchronized (this) {
            if (m_iStatusScale != SCALE_READY) {
                try {
                    wait(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (m_iStatusScale != SCALE_READY) {
                    m_iStatusScale = SCALE_READY;
                }
            }
            m_dWeight = "0.0";
            read();
            try {
                wait(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return m_dWeight;
        }
    }
    private void read() {
        try {           
            m_CommSerialPort.openPort(); 
            m_CommSerialPort.setEventsMask(SerialPort.MASK_RXCHAR);
            m_CommSerialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
            m_CommSerialPort.setParams(SerialPort.BAUDRATE_9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 
            m_CommSerialPort.addEventListener(this);    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * @param e
     */
    public void serialEvent(SerialPortEvent event) {
        // Determine type of event.
        switch (event.getEventType()) {
        case SerialPortEvent.BREAK:
        case SerialPortEvent.CTS:
        case SerialPortEvent.DSR:
        case SerialPortEvent.ERR:
        case SerialPortEvent.RING:
        case SerialPortEvent.RLSD:
        case SerialPortEvent.RXFLAG:
        case SerialPortEvent.TXEMPTY:
            break;
        case SerialPortEvent.RXCHAR:
            try {
                Thread.sleep(200);
                m_dWeight = new String (m_CommSerialPort.readBytes());
                System.out.println("readBytes: " + m_dWeight);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (SerialPortException e) {
                e.printStackTrace();
            }
            break;
        }
    }
}

Sample of what I get: enter image description here

1
What is your question? What is the expected output?Johnny Mopp
Side note: Hungarian notation is not used much these days. Back in olden times - before Intellisense - it was useful. But with modern IDEs it is much easier to get immediate info on a variable.Johnny Mopp
My question is how to convert this to readable data number or string ? and I expect to get a number from the scale machine that is connected.Mustafa Samir
You mean by that It's not an ambiguous reading its just the conversion from byte array to string that isn't correct.Mustafa Samir

1 Answers

0
votes

I don't know the protocol of the device you are using, but it appears to send 12 bytes per message. <STX><+-><9 digit hex><ETX>. So, read 12 bytes at a time, and convert the hex to decimal.

So, first change

m_dWeight = new String (m_CommSerialPort.readBytes());

to

m_dWeight = new String(m_CommSerialPort.readBytes(12));

Then, parse the message:

// ☻+00000001B♥
char stx = m_dWeight.charAt(0);
char etx = m_dWeight.charAt(11);
if (stx == 2 && etx == 3) {
    long actualValue = Long.parseLong(m_dWeight.substring(1, 11), 16);
    System.out.println(actualValue);
}