2016-10-20 4 views
0

Ich arbeite an einem kleinen Projekt, Wetterstation zu machen und die Daten mit Python-Programmierung zu sammeln. Ich verwende diese Wetterstation click here.Wie bekomme ich die Datenausgabe von UART Beaglebone mit Python

Das Problem ist, dass Wetterstation nur Beispielcode mit C-Programmierung bietet, ich bin nicht gut damit. Also ich entscheiden Python zu verwenden, aber das Datenausgabeformat ist wie dies

c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 

ich minicom bin mit der Ausgabe zu sehen. Ich verstehe nicht, wie das Code-Beispiel auf ihrer Website funktioniert. Wenn Sie mir eine Erklärung oder ein Beispiel dafür geben können, wie es funktioniert und es in Python-Programmierung umwandeln, wird das großartig.

Dies wird Code ihre Probe mit C geschrieben Sie

 char     databuffer[35]; 
     double    temp; 

     void getBuffer()                 //Get weather status data 
     { 
      int index; 
      for (index = 0;index < 35;index ++) 
      { 
      if(Serial.available()) 
      { 
       databuffer[index] = Serial.read(); 
       if (databuffer[0] != 'c') 
       { 
       index = -1; 
       } 
      } 
      else 
      { 
       index --; 
      } 
      } 
     } 

     int transCharToInt(char *_buffer,int _start,int _stop)        //char to int) 
     { 
      int _index; 
      int result = 0; 
      int num = _stop - _start + 1; 
      int _temp[num]; 
      for (_index = _start;_index <= _stop;_index ++) 
      { 
      _temp[_index - _start] = _buffer[_index] - '0'; 
      result = 10*result + _temp[_index - _start]; 
      } 
      return result; 
     } 

     int WindDirection()                 //Wind Direction 
     { 
      return transCharToInt(databuffer,1,3); 
     } 

     float WindSpeedAverage()                //air Speed (1 minute) 
     { 
      temp = 0.44704 * transCharToInt(databuffer,5,7); 
      return temp; 
     } 

     float WindSpeedMax()                 //Max air speed (5 minutes) 
     { 
      temp = 0.44704 * transCharToInt(databuffer,9,11); 
      return temp; 
     } 

     float Temperature()                 //Temperature ("C") 
     { 
      temp = (transCharToInt(databuffer,13,15) - 32.00) * 5.00/9.00; 
      return temp; 
     } 

     float RainfallOneHour()                //Rainfall (1 hour) 
     { 
      temp = transCharToInt(databuffer,17,19) * 25.40 * 0.01; 
      return temp; 
     } 

     float RainfallOneDay()                //Rainfall (24 hours) 
     { 
      temp = transCharToInt(databuffer,21,23) * 25.40 * 0.01; 
      return temp; 
     } 

     int Humidity()                  //Humidity 
     { 
      return transCharToInt(databuffer,25,26); 
     } 

     float BarPressure()                 //Barometric Pressure 
     { 
      temp = transCharToInt(databuffer,28,32); 
      return temp/10.00; 
     } 

     void setup() 
     { 
      Serial.begin(9600); 
     } 
     void loop() 
     { 
      getBuffer();                  //Begin! 
      Serial.print("Wind Direction: "); 
      Serial.print(WindDirection()); 
      Serial.println(" "); 
      Serial.print("Average Wind Speed (One Minute): "); 
      Serial.print(WindSpeedAverage()); 
      Serial.println("m/s "); 
      Serial.print("Max Wind Speed (Five Minutes): "); 
      Serial.print(WindSpeedMax()); 
      Serial.println("m/s"); 
      Serial.print("Rain Fall (One Hour): "); 
      Serial.print(RainfallOneHour()); 
      Serial.println("mm "); 
      Serial.print("Rain Fall (24 Hour): "); 
      Serial.print(RainfallOneDay()); 
      Serial.println("mm"); 
      Serial.print("Temperature: "); 
      Serial.print(Temperature()); 
      Serial.println("C "); 
      Serial.print("Humidity: "); 
      Serial.print(Humidity()); 
      Serial.println("% "); 
      Serial.print("Barometric Pressure: "); 
      Serial.print(BarPressure()); 
      Serial.println("hPa"); 
      Serial.println(""); 
      Serial.println(""); 
     } 

danken.

Antwort

0

Sie müssen das Datenformat „entschlüsseln“, wie im Handbuch vorgeschlagen (es gibt 37 Byte pro Sekunde, einschließlich Ende CR/LF):

c000:air direction, degree 
s000:air speed(1 minute), 0.1 miles per hour 
g000:air speed(5 minutes), 0.1 miles per hour 
t086:temperature, Fahrenheit 
r000:rainfall(1 hour), 0.01 inches 
p000:rainfall(24 hours), 0.01 inches 
h53:humidity,% (00%= 100) 
b10020:atmosphere,0.1 hpa 

Zum Beispiel, wenn Sie die Eingabezeile haben:

c000s000g000t084r000p000h63b10040 

dann die Luftstromrichtung [Grad] in c (Beispiel oben) zu erhalten:

int WindDirection() //Wind Direction 
    { 
     return transCharToInt(databuffer,1,3); 
    } 

Und in Python :

def win_direction(): 
    return int(dataBuffer[1,3]) 

Sie müssen jetzt warf alle 8 Teile der Datenstruktur passieren und eine Funktion erstellen, die die Daten extrahieren und sie in sinnvolle Zahl umwandeln, wenn nötig.

+0

Großartig, danke für Ihre Antwort, aber können Sie mehr Beispiel für die Verwendung von Python basierend auf diesem Beispielcode, wenn Sie nichts dagegen .. Ich bin immer noch verwirrt, –

+0

'TypeError: String-Indizes müssen ganze Zahlen sein , nicht Tupel 'das ist, was ich habe. –

+0

Sie müssen Ihren Programmierversuch teilen. Die grundlegende Sache, die Sie verstehen müssen, ist, dass Sie eine Zeichenkette haben und Sie jedes Split-Ergebnis in unterschiedliche Maße teilen müssen. –

Verwandte Themen