我一直在研究一个使用arduino(NANO ATmega328)的项目,该项目从心率+其他传感器读取值,并使用串行通信以数据包形式发送数据。然后,我从一个基本的python脚本中读取序列,将数据写为文件,以便稍后绘制。
ser = serial.Serial('/dev/ttyUSB0', 9600)
final_output_file = open('final_output_file.out','w')
while True:
initial =time.time()
x = ser.readline() # Read the newest output from the Arduino
final_output_file.write(str(initial)+" , " + str(x) )
sleep(.01)
我是串口通讯的新手,毫无疑问我在这段代码中遗漏了一些东西(例如异常处理),但它在过去完成了长时间提供数据写入的工作。
我现在遇到的问题是,有时文件被写为二进制(应用程序/八位字节流)类型,而其他文件则是纯文本输出(我想从中绘制)。以下是不同输出中一行的示例(如果有用):
binary(application / octet-stream) - 一行输出
2c20 3020 2c20 3238 362e 3531 202c 2030
纯文本(我想要的) - 输出
1451781797.29 , 0 , 518 , 147 , 0.00 , 0 , 0 , 0.00000000 , 0.00000000
我可以看到它们包含不同数量的条目。我也试过从这里转换回字符串(我知道这可能是愚蠢的,但在我的天真中,我做了......)。
我试过寻找其他问题来寻找答案。我一直使用这个网站,通常找到我想要的东西(这是我的第一篇文章)。
arduino是否随意更改其输出格式?我已经将arduino输出打印到终端进行检查,但似乎没有。我使用arduino进行串行通信的方法只是:
Arduino连续打印
Serial.print(Signal1);
Serial.print(" , ");
Serial.print(Signal2);
...
作为猜测的危险,我的python代码中的x = ser.readline()
(如上图所示)可能是罪魁祸首?我是否必须提供我想要阅读的数据类型的详细信息?我原以为这会暗示。
请帮忙!如果这是一个菜鸟的错误......那是因为我是菜鸟!如果它有用,很高兴提供任何进一步的信息。
Arduino代码:
void loop(){
digitalWrite(7, HIGH); //MUSIC SHIELD PULL HIGH TO NOT ACTIVATE
if (i>count) //RESET AFTER 600 reads
{
i=0;
}
Serial.print(i);
Serial.print(" , ");
Serial.print(Signal);
Serial.print(" , ");
Serial.print(BPM);
Serial.print(" , ");
Serial.print(gyro1);
Serial.print(" , ");
Serial.print('0');
Serial.print(" , ");
Serial.print('0');
Serial.print(" , ");
Wire.beginTransmission(MPU);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU,14,true); // request a total of 14 registers
AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
gyro_read1=gyro1;
gyro1=sqrt(pow(GyX,2)+pow(GyY,2)+pow(GyZ,2));
gyro_read2=gyro1;
//Serial.println(digitalRead(11)); - Test push buttons
int val=digitalRead(11);
if(val==0)
{
sfx.playTrack(n0);
}
if ( i == count) //if i reaches the 600 count mark, meaure the new unbiased std deviation
{
stddev_heart_stat= myStats_heart.unbiased_stdev();
stddev_gyro_stat=myStats_gyro.unbiased_stdev();
Serial.print(stddev_heart_stat,8);
Serial.print(" , ");
Serial.println(stddev_gyro_stat,8);
myStats_heart.clear();
myStats_gyro.clear();
if(stddev_gyro_stat<16.7 && stddev_heart_stat>5 && hour()>3 )
//test if(stddev_gyro_stat<18.7 && stddev_heart_stat>0 && hour()>0 )
{
uint8_t n = 0;
sfx.playTrack(n);
delay(3000);
Serial.print(i);
Serial.print(" , ");
Serial.print(0);
Serial.print(" , ");
Serial.print(0);
Serial.print(" , ");
Serial.print(0);
Serial.print(" , ");
Serial.print('0');
Serial.print(" , ");
Serial.print('0');
Serial.print(" , ");
Serial.print(0);
Serial.print(" , ");
Serial.println(0);
digitalWrite(7, HIGH);
}
}
else
{
myStats_gyro.add(gyro1);
myStats_heart.add(BPM);
Serial.print(stddev_heart_stat,8);
Serial.print(" , ");
Serial.println(stddev_gyro_stat,8);
}
heart_read1=BPM;
heart_read2=BPM;
delay(100);
i+=1;
}