Java 一段时间后接收串行数据时出错

Java 一段时间后接收串行数据时出错,java,multithreading,serial-port,Java,Multithreading,Serial Port,我的微控制器以这种格式连续发送数据900 899 | 900 898 | 900 800 700 | 900 799 900 756 |。我的Java代码在一段时间内正确读取数据,但后来它接收到类似于900 899900 899的内容。请注意,在我的第一个900之前有一个空格,这会导致错误,导致Java.lang.NumberFormatException:在我将字符串转换为int的语句处。。请帮我解决这个错误。。。 注:检查这些读数900 808 900 899 | 900 806 900 8

我的微控制器以这种格式连续发送数据900 899 | 900 898 | 900 800 700 | 900 799 900 756 |。我的Java代码在一段时间内正确读取数据,但后来它接收到类似于900 899900 899的内容。请注意,在我的第一个900之前有一个空格,这会导致错误,导致Java.lang.NumberFormatException:在我将字符串转换为int的语句处。。请帮我解决这个错误。。。 注:检查这些读数900 808 900 899 | 900 806 900 899 | 900 899900 899 |本应读取900 804,而不是读取之前接收到的值,即900 899

import java.io.*;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.*;

import javax.comm.*;

public class SimpleRead implements Runnable, SerialPortEventListener {

static int X[];
static int Y[];
InputStream inputStream;
SerialPort serialPort;
Thread readThread;
byte[] readBuffer = new byte[500];
byte[] noOfBalls = new byte[2];
byte[] temp = new byte[1];
static int arrayEnd = 0;

public SimpleRead(CommPortIdentifier portId) {

    try {
        serialPort = (SerialPort) portId.open("SimpleReadApp", 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 {
        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:
        arrayEnd = 0;
        try {
            while (inputStream.available() > 1 ) {
          /*    for(int i=0; i< 2; i++){
                    inputStream.read(temp);
                    noOfBalls[i] = temp[0];
                }
                String tmp = new String(noOfBalls);
                int iterations = Integer.parseInt(tmp);
                iterations = iterations * 2;
                for(int j =0; j< iterations; j++){*/
                inputStream.read(temp);
                if (temp[0] == '|') break;
                else
                    readBuffer[arrayEnd++] = temp[0];

                //}
           }
        } catch (IOException e) {System.out.println(e);}
        createXYArray();

       // serialPort.close();/****closing for now, later not needed*/
        break;
    }
}

private void createXYArray() {
    System.out.println(new String(readBuffer));
    X = new int[100];
    Y = new int[100];
    byte[] tmpXY = new byte[3];
    int i = 0;
    while(i < readBuffer.length){
        if(readBuffer[i]==0) break;
        int j=0;
        while(readBuffer[i]!=' ' && j!=3){
            //System.out.println(i);
            tmpXY[j] = readBuffer[i];
            //System.out.println("x "+tmpXY[j]);
            i++; j++;
        }
//  if(j!=3) break;
            createX(tmpXY);
        i++;
        j = 0;
        while(readBuffer[i]!=' ' && j!=3 ){
            tmpXY[j] = readBuffer[i];
        //  System.out.println("y "+tmpXY[j]);
            i++;
            j++;
        }
    /*  if(j==3){
            for (int k = 0; k < 3; k++) {
                three[k] = tmpXY[k];
            }
            createY(three);
        }
        else   */
            createY(tmpXY);
        i++;
    }
}

private static void createY(byte[] tmpY2) {

    String tmp = new String(tmpY2);
    Y[arrayEnd] = Integer.parseInt(tmp);
    //System.out.println(Y[arrayEnd]+" y");
    arrayEnd++;
}

private static void createX(byte[] tmpX2) {

    String tmp = new String(tmpX2);
    X[arrayEnd] = Integer.parseInt(tmp);
    //System.out.println(X[arrayEnd]+" x");

}
}

对正在分析的字符串对象使用trim方法。这将删除任何前导空格或尾随空格。

好了,伙计们,我知道错误是什么了。在inputStream.available>1的语句中,我们必须用-1替换1。我真的不知道为什么,但我做了尝试和错误,我发现它工作正常,而inputStream.available>-1。
如果有人知道原因,请添加评论。

是的,这会有所帮助,但真正的问题在于阅读。。检查这个900 808 900 899 | 900 806 900 899 | 900 899900 899 |这里应该是900 804。但它不是读取该值,而是读取以前接收到的值。i、 e 900 899。我的读卡器可能有什么问题?你确定微控制器正在发送你期望的数据吗?是的,我检查了puTTy,它发送正确。