我正在尝试将ADXL335加速度计数据从arduino转换为csv文件。使用串行监视器查看时,arduino代码可以完美地工作。处理代码在控制台中返回输出,但不将任何内容写入CSV文件。我不确定为什么无法打印。当我在第二条if语句中取消注释打印时,这些值存储在csv文件中,但是它仅适用于15个值输入,然后重复这些相同的值,直到代码停止。当我们嵌入if语句时,我们再次在csv文件中什么也没有得到。我认为第一个if语句有些问题,但是我不确定如何继续进行故障排除。我想知道如何做到这一点,以便获得加速度计读数的连续输出。提前致谢。
这是我的arduino代码:
void setup() {
pinMode(14,INPUT);//define mode of pin
pinMode(15,INPUT);
pinMode(16,INPUT);
Serial.begin(9600);//serial communication begin
delay(10);
}
void loop()
{
//Serial.print(",");
Serial.print("X=");
Serial.print(analogRead(14));
Serial.print(",");
Serial.print("Y=");
Serial.print(analogRead(15));
Serial.print(",");
Serial.print("Z=");
Serial.print(analogRead(16));
Serial.println(",");
delay(100);
}
这是我的处理代码:
void setup() {
output = createWriter( "data.csv" );
mySerial = new Serial( this, Serial.list()[1], 9600 );
}
void draw() {
if (mySerial.available() > 0 ) {
value = mySerial.readString();
System.out.print(value);
output.println(value);
}
if ( value != null ) {
//output.println(value);
output.println();
}
}
void keyPressed() {
output.flush(); // Writes the remaining data to the file
output.close(); // Finishes the file
exit(); // Stops the program
}
答案 0 :(得分:1)
首先,您可能需要更改arduino代码以输出有效的CSV行。 我建议暂时松开CSV标头,或从处理中添加它。
暂时尝试:
void loop()
{
Serial.print(analogRead(14));
Serial.print(",");
Serial.print(analogRead(15));
Serial.print(",");
Serial.print(analogRead(16));
Serial.println(",");
delay(100);
}
这应该输出类似####,####,####,
的内容,它是有效的CSV行。
在处理方面,我还建议先进行缓冲,直到新行(\n
)字符为止,您可以使用bufferUntil()
和serialEvent()
import processing.serial.*;
// serial port
Serial mySerial;
// single line containing acc. values as a CSV row string
String values;
// the output
PrintWriter output;
void setup() {
output = createWriter( "data.csv" );
try{
mySerial = new Serial( this, Serial.list()[1], 9600 );
mySerial.bufferUntil('\n');
}catch(Exception e){
println("Error opening serial port: double check USB cable, if Serial Monitor is open, etc.");
e.printStackTrace();
}
}
void draw() {
background(0);
if(values != null){
text("most recent values:\n" + values,10,15);
}
}
// gets called when new data is in, and since we're buffering until \n it's one csv line at a time
void serialEvent(Serial p) {
values = p.readString();
if(values != null && values.length() > 0){
println(values);
// if values.trim() isn't call, the \n should still be there so print() will suffice in terms of adding a new line
output.print(values);
}else{
println("received invalid serial data");
}
}
void keyPressed() {
output.flush(); // Writes the remaining data to the file
output.close(); // Finishes the file
exit(); // Stops the program
}
还要注意对串行连接和读取的串行数据的错误检查
(这是检查可能出问题的好习惯)。
(可选)您可以在setup()
的CSV文件中添加标题:
output = createWriter( "data.csv" );
output.println("X,Y,Z,");
就编写CSV文件而言,有许多方法可以执行此操作,并且Processing具有Table class,可让您读取/解析和写入CSV数据。目前,您的PrintWriter方法非常简单:使用它。