python file.write()不一致的输出格式

时间:2016-01-04 11:12:12

标签: python-2.7 serialization arduino serial-port

我一直在研究一个使用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; 
}

0 个答案:

没有答案