Java 一段时间后接收串行数据时出错
我的微控制器以这种格式连续发送数据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 899Java 一段时间后接收串行数据时出错,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
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,它发送正确。