Read from commport does not return full java result

I tried to read from com port using rxtx API. The COM port was connected to the microcontroller, so every time I pressed a button on the microcontroller board, it would return me the number of bytes from 0x01 to 0xff. I wanted to display these numbers in the java console, but it looks like it could read up to 0x40. All other byte numbers after seemed lost. I was confident that the microcontroller was working well as I tested in another terminal program, which then gave the correct result. So I suspect there is something wrong with my input stream. Is there anyone who could help me find the problem? Below is my Java code which is a typical example of COM reading code I found from google.

import gnu.io.CommPortIdentifier;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;
import java.io.*;
import java.util.*;

public class SimpleRead implements Runnable, SerialPortEventListener {
static CommPortIdentifier portId;
static Enumeration portList;

InputStream inputStream;
SerialPort serialPort;
Thread readThread;

public static void main(String[] args) {
    portList = CommPortIdentifier.getPortIdentifiers();

    while (portList.hasMoreElements()) {
        portId = (CommPortIdentifier) portList.nextElement();

        if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
             if (portId.getName().equals("COM7")) {
        //                if (portId.getName().equals("/dev/term/a")) {
                SimpleRead reader = new SimpleRead();
            }
        }
    }
}

public SimpleRead() {
    try {
        serialPort = (SerialPort) portId.open(this.getClass().getName(), 2000);
    } catch (PortInUseException e) {System.out.println(e);}
    try {
        inputStream = serialPort.getInputStream();
    } catch (IOException e) {System.out.println(e);}
try {
        serialPort.addEventListener(this);
} catch (TooManyListenersException e) {System.out.println(e);}
    serialPort.notifyOnDataAvailable(true);
    try {
        serialPort.setSerialPortParams(115200,
            SerialPort.DATABITS_8,
            SerialPort.STOPBITS_1,
            SerialPort.PARITY_NONE);
    } catch (UnsupportedCommOperationException e) {System.out.println(e);}
    readThread = new Thread(this);
    readThread.start();
}

public void run() {
    try {
        //System.out.println("1");
        Thread.sleep(20000);
    } catch (InterruptedException e) {System.out.println(e);}
}

public void serialEvent(SerialPortEvent event) {
    switch(event.getEventType()) {
    case SerialPortEvent.BI:
    case SerialPortEvent.OE:
    case SerialPortEvent.FE:
    case SerialPortEvent.PE:
    case SerialPortEvent.CD:
    case SerialPortEvent.CTS:
    case SerialPortEvent.DSR:
    case SerialPortEvent.RI:
    case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
        break;
    case SerialPortEvent.DATA_AVAILABLE:
        byte[] readBuffer = new byte[4049];

        try {
            while (inputStream.available() > 0) {
                int numBytes = inputStream.read(readBuffer);
            }
            for(Byte bytenum: readBuffer)System.out.print(Integer.toHexString(bytenum)+" ");

        } catch (IOException e) {System.out.println(e);}
        break;
    }
    if (serialPort != null) {
                try {
                    // close the i/o streams.
                    inputStream.close();
                } catch (IOException ex) {
                    System.out.println(ex);
                }
                // Close the port.
                serialPort.close();
            }

}

      

}

And here is the partial result (note that the number of bytes after 40 is not read successfully) 1 2 3 4 5 6 7 8 9 abcdef 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 0 ​​0 0 0 0 0 0

thank

+3


source to share


1 answer


The serial port sends parts ending with ({0}). You must break first. And you can get the next part of the message. But in your code, this is not possible because you are closing the stream and port. Do this in a loop until all data is received.



0


source







All Articles