0

Ok, im lost and dont know what to even google at this point.

I am reading data from a serial port using JSSC.

When I print as a check figure, the data is jacked up. It prints a few rows fine then prints by individual characters. It prints normally if I use "printf"

$GPRMC,212729.000,A,3805.8438,N,08459.5498,W,0.00,280.71,031117,,,D*73
$GPVTG,280.71,T,,M,0.00,N,0.0,K0
F



$
G
P
G

This is the for loop im using:

  for (String s: data2) { 

                System.out.println(s);

                 }

Other code:

String getData =  serialPort.readString(event.getEventValue());

List<String> data2 = new ArrayList<String>(Arrays.asList(getData.split("$")));

If I were just printing it, i would be fine with printf.

I need to split each sentence up by the $ sign.

Any help would be appreciated.

    import jssc.SerialPort; 
    import jssc.SerialPortEvent; 
    import jssc.SerialPortEventListener; import jssc.SerialPortException;
    import java.util.Arrays;
    import java.util.ArrayList;
    import java.util.List;


    public class test {

    static SerialPort serialPort;

    public static void main(String[] args) {
        serialPort = new SerialPort("COM!"); 
        try {
            serialPort.openPort();//Open ports
            serialPort.setParams(4800, 8, 1, 0);//Set params
          int mask = SerialPort.MASK_RXCHAR + SerialPort.MASK_CTS + SerialPort.MASK_DSR;//Prepare mask
           serialPort.setEventsMask(mask);//Set mask
           serialPort.addEventListener(new SerialPortReader());//Add SerialPortEventListener


        }
        catch (SerialPortException ex) {
            System.out.println(ex);
        }

}public void serialEvent(SerialPortEvent event) {
          //  if(event.isRXCHAR()){//If data is available
           //    if(event.getInputBufferBytesCount()  > 1){//Check bytes count in the input buffer
                    //Read data, if 10 bytes available 
                    try {


                          String getdata =  serialPort.readString(event.getEventValue());

                          String delimiter = "$";

                      List<String> data2 = new ArrayList<String>(Arrays.asList(getdata.split("$")));


                   for (String s: data2) { 

                    System.out.printf("NEW" + s);

                     }
                    }
                    catch (SerialPortException ex) {

                    }

UPDATED CODE PER REQUEST

    import jssc.SerialPort; 
import jssc.SerialPortEvent; 
import jssc.SerialPortEventListener; import jssc.SerialPortException;
//import java.util.Arrays;
//import java.awt.List;
//import java.util.Base64;
//import java.io.BufferedReader;
//import java.io.ByteArrayInputStream;
//import java.io.InputStream;
//import java.io.InputStreamReader;
//import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.io.IOException;
import java.lang.*;
//import static java.util.Arrays.asList;
//import java.util.List;
//import java.util.stream.Collectors;
//import org.apache.commons.lang3.StringUtils;


public class test {
static ArrayList<String> data = new ArrayList<String>();
static SerialPort serialPort;

public static void main(String[] args) {
    serialPort = new SerialPort("COM1"); 
    try {
        serialPort.openPort();//Open ports
        serialPort.setParams(4800, 8, 1, 0);//Set params
      int mask = SerialPort.MASK_RXCHAR + SerialPort.MASK_CTS + SerialPort.MASK_DSR;//Prepare mask
       serialPort.setEventsMask(mask);//Set mask
       serialPort.addEventListener(new SerialPortReader());//Add SerialPortEventListener


    }
    catch (SerialPortException ex) {
        System.out.println(ex);
    }
}

/*
 * In this class must implement the method serialEvent, through it we learn about 
 * events that happened to our port. But we will not report on all events but only 
 * those that we put in the mask. In this case the arrival of the data and change the 
 * status lines CTS and DSR
 */

static class SerialPortReader implements SerialPortEventListener {

    public void serialEvent(SerialPortEvent event) {
    //   if(event.isRXCHAR()){//If data is available
      //     if(event.getEventValue() < 577){//Check bytes count in the input buffer
                //Read data, if 10 bytes available 

                try {
                    String getdata =  serialPort.readString(event.getEventValue());
                String[] parts= getdata.split("$");

                data.set(data.size() - 1, data.get(data.size() - 1) + parts[0]);
                for (int i=1; i<parts.length; i++) {
                    data.add(parts[i]);
                }

                }
                catch (SerialPortException ex) {                  
             }

       }        
}
}
4

1 回答 1

1

Your serialEvent method is just an EventListener that fires up for each SerialPortEvent, but there's no guarantee the data will arrive "complete", so you should declare the List at class level, take the data that arrives and store it in the appropriate way. Something like:

public class test {
    // ...
    static List<String> data = new ArrayList<String>();
    // ...
    public void serialEvent(SerialPortEvent event) {
        try {
            String getdata =  serialPort.readString(event.getEventValue());
            // String.split takes a regular expression. In regular expressions,
            // the dollar sign ($) by it's own means the end of the line, so you
            // have to escape it using a backslash (\), but since it's a string
            // you have to escape that one with another backslash so it get's
            // passed correctly, thus searching for the dollar sign and not the
            // end of the line
            String[] parts = getdata.split("\\$");
            // Append whatever is before the first dollar sign to the last item
            // in your data
            if(!data.isEmpty()){
                data.set(data.size() - 1, data.get(data.size() - 1) + parts[0]);
            }
            // Append the rest of the parts in your data
            for (int i=1; i<parts.length; i++) {
                data.add(parts[i]);
            }
        }
        catch (SerialPortException ex) {}
        // ...
    }
    // ...
}
于 2017-11-05T15:49:51.370 回答