Java 从连续 USB 流读取显示损坏

标签 java usb ascii inputstream corruption

我有一个应用程序,可以将 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/

相关文章:

java - 由 : java.net.SocketException 引起:来自服务器的文件意外结束

java - 从 SAS 调用 java 类。错误: Could not find class

Java md5,PHP 方式

iOS TCP/IP over USB 与 Linux 端

Android - 与 FTDI 芯片和 d2xx 驱动程序的 USB 通信

linux - ffmpeg/dev/video1 : No space left on device

mysql char 只显示第一个字符

MATLAB,ASCII 文件。文本扫描?导入数据?加载?它们都不起作用

java - log4.xml 中用于访问 java 系统属性的表达式语言是什么?

c# - 强制 C# 使用 ASCII