2016-06-06 37 views
-1

Ich benutze Arduino Uno in meinem Projekt: Einer ist ein Master und der andere ist ein Slave. Ich sende Daten vom Master zum Slave mit I2C. Ich muss float senden, aber da I2C nur char senden kann, bin ich verpflichtet, Float in String zu transformieren, dann Zeichen für Zeichen zu senden und sie im Slave zusammenzusetzen.Arduino globale Variable mit I2C und LCD

Das Problem, das ich hatte, ist, deklariere ich die Variable (in der Slave), die Float Empfangen und assumbling vom Master wie eine globale Variable enthalten, und ich muss es in meinem Code in der Slave verwenden, aber Mein Problem ist, dass es immer als 0 gedruckt wird, und es gibt nicht den richtigen Wert davon.

Der Code Ich verwende ist:

#include <LCD16x2.h> 
#include <Wire.h> 

LCD16x2 lcd; 

int buttons; 
int sensorPin = A0; // select the input pin for the potentiometer 
int sensorValue = 0; // variable to store the value coming from the sensor 

float numOut=0; // The Global Variable 

int comp=1 ; 

String wordd = ""; 

void setup() 
{ 
    Wire.begin(8);    // join i2c bus with address #8 
    Wire.onReceive(receiveEvent); // register event 
    Serial.begin(9600);   // start serial for output 

    lcd.lcdGoToXY(1,1); 
    lcd.lcdClear(); 
    lcd.lcdWrite("EG   "); 
    lcd.lcdGoToXY(7,1); 
    lcd.lcdWrite(numOut,3); 
} 

void loop() 
{ 

} 
// function that executes whenever data is received from master 
// this function is registered as an event, see setup() 

     void receiveEvent(int howMany) 
{ 
     wordd = ""; 
     int x = Wire.read(); 
     for (int i=0; i<=x; i++) 
     { 
     char c = Wire.read(); 
     wordd += c; 
     } 

     numOut = wordd.toFloat(); 
     Serial.println(numOut,3);   // print the integer 

} 

Ich muss wissen, wie das Ergebnis der globalen Variablen „numOut“, um es in meinem Code zu verwenden.

Vielen Dank im Voraus. !!

+0

Versuchen Sie, 'float numOut = 0;' in 'volatile float numOut = 0;' zu ändern und 'String wordd =" ";' in 'volatile String wordd =" ";' zu ändern, um nicht richtig optimiert zu werden. – MikeCAT

+0

Es funktioniert nicht auch:/!! –

+0

Mögliche Duplikate von [Globale Variable Arduino] (http://StackOverflow.com/Questions/37648796/Global-Variable-arduino) ** Stellen Sie keine Frage erneut! ** – Olaf

Antwort

-1

Haben Sie tatsächlich überprüft, ob die empfangenen Daten korrekt sind? Ich weiß nicht über die Strings des Arduino, aber wenn Ihr toFloat() ausfällt, kann es 0 zurückgeben.

Überprüfen Sie über Ihre serielle Schnittstelle, wenn Ihre Wordd-Variable korrekt ist, und wie bereits erwähnt globale Variablen als volatile deklariert werden sollten. EDIT: volatile ist hier notwendig, um sicherzustellen, dass Ihre Daten zwischen Ihren verschiedenen Funktionsaufrufen synchronisiert werden (andernfalls könnte Ihr Programm den Wert in einem Register behalten, obwohl der "echte" Wert durch einen Interrupt aktualisiert wurde). Allerdings wie jemand sagte volatile ist NICHT notwendig für jede globale Variable, aber Sie werden nicht mit Semaphoren/Mutex ... auf einem Arduino so Stick Hexe volatile für das Problem, das Sie veröffentlicht.

EDIT: https://www.arduino.cc/en/Reference/StringToFloat „Wenn keine gültige Konvertierung durchgeführt werden kann, da die Zeichenfolge nicht mit einer Ziffer beginnt, ein Null zurückgeführt wird“

+0

"globale Variablen sollten als' volatile' deklariert werden, ist als absolute Aussage falsch. Und das ist keine Antwort, sondern eher ein Kommentar. – Olaf

+0

Leider konnte ich seine Antwort nicht kommentieren. Und Sie müssen flüchtig für globale Variablen verwenden; zumindest auf einem Arduino, sonst sehe ich nicht, wie Sie Ihre Daten synchronisieren können. Bearbeite meine Antwort aber – pLesur

+0

Ja, um zu sehen, ob meine Variable korrekt ist oder nicht, sende ich es direkt an Matlab: Serial.println (numOut, 3); und es ist richtig. –