Arduino的Java记录器
我正在开发一个用Java编写的Arduino记录器 我已经开始使用Arduino游乐场的示例代码: 我的问题是我认为: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
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创建新行:-)
顺便说一下,如果您在控制台中直接打印数据时没有发现任何问题,那是因为新行字符来自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.
}