Arduino的Java记录器

Arduino的Java记录器,java,logging,arduino,Java,Logging,Arduino,我正在开发一个用Java编写的Arduino记录器 我已经开始使用Arduino游乐场的示例代码: 我的问题是我认为: if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { try { int available = input.available(); byte chunk[] = new byte[available]; input

我正在开发一个用Java编写的Arduino记录器

我已经开始使用Arduino游乐场的示例代码:

我的问题是我认为:

if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
        try {
            int available = input.available();
            byte chunk[] = new byte[available];
            input.read(chunk, 0, available);


            // Displayed results are codepage dependent
            String print = new String(chunk);
            test.write(print);
            System.out.print(print);


        } catch (Exception e) {
            System.err.println(e.toString());
        }
我编写了一个类,将数据写入csv文件。当它将数据打印到控制台时,它是完美的。当我将其写入文件时,我会得到一些完美的行,有时是糟糕的行,如:

60
4

5
28
我希望它像这样打印:

604
528
我的写作方法是:

public void write(String print)
{

    pw.print(System.currentTimeMillis());
    pw.print(",");
    pw.println(print);
}

非常感谢您的建议

当您在控制台和文件中编写关于打印数据的内容时,您不会做完全相同的事情。您可以在控制台上打印原始数据,这样在使用write()方法处理数据时不会看到任何问题,这可能会导致出现一些问题

问题不在于write()方法,而在于使用它的方式。一旦你有了一些数据,你就把它打印出来。问题是,你可能没有收到所有的数据,所以你打印得太早了

这在数据流中非常常见:当数据可用时,操作系统会向您发出警告,但当Arduino向您发出警告时,它可能只接收(比方说)5个字节中的3个字节。操作系统本身无法知道您在等待5个字节,而不是3个字节

因此,您必须存储并连接数据,直到您知道数据已全部接收。有两种可能性:

  • 如果您知道将发送n个字节,请存储数据,直到收到n个字节
  • 等待指示数据结尾的字符标志:我假设您在Arduino中使用Serial.println()方法,这意味着数据结尾将有“\r\n”。顺便说一句,这就是为什么在打印数据时文件中有一些新行,因为您没有告诉Jave创建新行:-)
代码可能更好,但为了保持简单,因为我不确定您的Java水平,为了保持代码,您可以这样做(警告,我没有测试它):


顺便说一下,如果您在控制台中直接打印数据时没有发现任何问题,那是因为新行字符来自Arduino,而不是Java代码。因此,您打印的数据流没有中断,因为您在屏幕上打印的字符之间没有插入任何内容。在您的示例中,您首先收到“60”,然后收到“4\r\n”。这是一种屏幕上的自动连接。

谢谢,它工作得非常完美!!我只是想知道“\r”是什么,我认为“\n”创造了新的线路。一个遗产。在旧的机械式打字机中,您必须返回到当前行的开头(\r),然后返回到新行(\n)。在计算机上,新行的编码取决于操作系统:通常\r\n对于windows(“像”旧打字机),\r对于旧Mac,\n对于类unix操作系统。但这毕竟是一个惯例。您只能将\n用于Arduino和计算机之间的协议,这取决于您。但是默认情况下,使用Serial.println()将添加一个\r\n。
// Should be outside of your serialEvent method
StringBuilder buffer = new StringBuilder();

public synchronized void serialEvent(SerialPortEvent oEvent) {
    if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
        try {
            int available = input.available();
            byte chunk[] = new byte[available];
            input.read(chunk, 0, available);

            // We store data in a buffer
            buffer.append(new String(chunk));
            // We check if we received the characters indicating
            // the end of your data
            int endOfLineIndex = buffer.indexOf("\r\n");
            // We don't, so we leave and wait for more data
            if (endOfLineIndex == -1) { 
                return;
            }

            // The "+2" is to keep the "\r\n"
            String print = buffer.substring(0, endOfLineIndex+2);
            // Do not forget to remove what was used in the buffer
            buffer.delete(0, endOfLineIndex+2);

            test.write(print);
            System.out.print(print);

        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }
    // Ignore all the other eventTypes, but you should consider the other ones.
}