我有一个应用程序,可以将 USB 设备中的数据记录到本地文件,但是接收到的数据已损坏。数据以 ASCII 编码,有 4 列信息,以空格分隔。该设备连接有 2 个传感器,第一列指示传感器。数据以 60Hz 的频率发送,两个传感器数据同时传输。理想的输出应该是这样的形式
01 value1 value2 value3
02 value1 value2 value3
01 value1 value2 value3
等等...
然而,前两行是正确的,但后续的备用行有很多空格(在 Windows 中,在 Ubuntu 中的 gEdit 中,它显示为\00s,而 Vim 将其显示为 ^@ 序列)。这是它在 gEdit 中的样子(请注意,所有\00 后面都有传感器值)
01 0.109 5.933 1.803
02 5.550 6.027 1.714
\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0001 0.109 5.933 1.803
02 5.553 6.027 1.713
\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0001 0.108 5.933 1.803
我正在测试录制 5 秒,到最后写入的行数据较少,而\00 较多。
数据以 ASCII 流的形式发送,回车后跟换行符分隔传感器值。读取是在线程类的 run() 方法中完成的。构造函数将 PrintWriter 实例化为目标输出文件,保存为变量 writer。运行方法如下所示。我想问题出在消息结尾的处理上,但无法让它工作。
public void run() {
long startTime = System.currentTimeMillis();
error = true;
have1 = false;
int data;
try {
// Send output commands to device
out = new FileOutputStream(portName);
out.write(0x0d);
out.close();
// Open stream to read from device
FileReader fr = new FileReader(portName);
BufferedReader br = new BufferedReader(fr);
while(System.currentTimeMillis() < startTime+ltime) {
data = br.read();
if (data == -1)
break;
else if (data == 0x0d) {
if (br.read() == 0x0a) {
//System.out.println(line);
writer.println(line+" "+System.currentTimeMillis());
line = "";
}
}
else { // Have data
line += (char) data;
}
}
br.close();
// Command to stop recording
out = new FileOutputStream(portName);
out.write('x');
out.close();
writer.flush();
writer.close();
}
catch (IOException e) { // generated by the device
e.printStackTrace();
readError = true;
System.out.println("RECORDING ERROR");
}
}
最佳答案
我认为可能是你的USB设备和你的程序不同步,我认为这个原因:
- 没有初始同步,您假设已同步。
- I/O 操作需要很长时间(相对于毫秒)。
解决方案:
- 在结束该过程之前不要写入任何文件,这会节省您的时间,而且据我所知,时间是一个问题。
- 解析数据以完全删除所有损坏的数据,或者假设它是最后一个和下一个有效数据之间的算术平均值(所有这些都应在数据收集后运行)。
我不知道如何同步设备,请尝试让它等待,直到收到一些数据。
关于Java 从连续 USB 流读取显示损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24495916/