2016-10-20 2 views
0

Я работаю над небольшим проектом, чтобы создать метеостанцию ​​и собирать данные с помощью программирования Python. Я использую эту метеостанцию ​​click here.Как получить данные от UART Beaglebone с помощью Python

Проблема в том, что метеорологическая станция предоставляет только пример кода с использованием программирования на языке С, я не очень хорош в этом. Поэтому я решил с помощью Python, но формат выходных данных, как этого

c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 
c000s000g000t084r000p000h63b10040 

Я использую Миник, чтобы увидеть результат. Я не понимаю, как работает образец кода на их веб-сайте, поэтому, если вы можете дать мне объяснение или какой-то пример того, как он работает и преобразовать его в программирование на Python, это будет здорово.

Это их пример кода, написанного с C

 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(""); 
     } 

Спасибо.

ответ

0

Вы должны «декодировать» формат данных, как предложено в руководстве (он выдает 37 байт в секунду, в том числе в конце 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 

Например, если у вас есть входной строки:

c000s000g000t084r000p000h63b10040 

Затем, чтобы получить направление воздуха [°] в с (в приведенном выше примере):

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

И я п Python:

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

Теперь нужно пройти метала все 8 частей структуры данных и построить функцию, которая будет извлекать данные и преобразовать его в соответствующее число, если это необходимо.

+0

Отлично, спасибо за ответ, но можете ли вы дать больше примеров использования Python на основе этого образца кода, если вы не возражаете .. Я все еще смущен, –

+0

'TypeError: строковые индексы должны быть целыми числами , а не кортеж "это то, что у меня есть. –

+0

Вам нужно будет поделиться с вами попыткой кодирования. Основная вещь, которую вам нужно понять, это то, что у вас есть строка, и вам нужно разделить ее на каждый результат разделения в разной мере. –

Смежные вопросы