Go Down

Topic: Wire.parseInt/Wire.parseFloat bleibt hängen. (Read 646 times) previous topic - next topic

Epijano

Hi zusammen,

Ich möchte ein paar Werte vom Datentyp float per I2C vom einen zum anderen Arduino(Uno) übertragen.
Hier der Programmcode für den sendenden Arduino:

Code: [Select]

/*
* I2C_Master
* Serielle Daten an einen I2C-Slave weitergeben

  Mit diesem Code wird sobald irgdendein Zeichen per Seriellem Monitor eingeht eine Zeichenkette per I2C an einen anderen Arduino weitergeschickt.
*/

#include <Wire.h>
const int address = 4; // Zu nutzende Adresse
char c;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
}

void loop()
{
  if(Serial.available() > 0 )
  {
    c = Serial.read();
   
    // Daten
    Wire.beginTransmission(address);                       // An Geraet senden
    Wire.print("#FA11.11B111.22C111.12D111.5#");
    Serial.println(Wire.endTransmission());
  }
}


Hier der Programmcode von dem Arduino der die Zeichen empfängt:

Code: [Select]

/*Dieser Code empfängt mit Wire.parseFloat eine Zeichenkette und sollte sie auf dem Seriellen Monitor ausgeben. Das ganze funktioniert aber noch nicht so gut.
Irgendwas stimmt mit Wire.parseFloat nicht.
*/

#include <Wire.h>

#define i2cAddresseArduino 4

void setup()
{
  Serial.begin(9600);
  Wire.begin(i2cAddresseArduino); // I2C-Bus ueber diese Adresse anbinden
  Wire.onReceive(receiveEvent); // Event-Handler fu¨r Requests registrieren
}

void loop()
{
  delay(1000);
}

void receiveEvent(int howMany)
{
  while(Wire.available())
  {
    Serial.println(Wire.parseFloat(),2);
  }
}


eigendlich nicht weiter kompliziert... Sobald Zeichen eingehen sol die nächste Zahl mit Wire.parseFloat eingelesen und auf den Seriellen Monitor geschrieben werden (und das noch möglichst so lange wie einzulesende Daten da sind). Aus irgendeinem Grund kommen da aber nur die ersten zwei Zeichen der ersten einzulesenden Zahl an (also in dem Fall eine 11).
Was mir noch aufgefallen ist ist, dass wenn ich das
Code: [Select]

  while(Wire.available())
  {
    Serial.println(Wire.parseFloat(),2);
  }

durch
Code: [Select]

Serial.println(Wire.parseFloat(),2);
Serial.println(Wire.parseFloat(),2);
Serial.println(Wire.parseFloat(),2);
Serial.println(Wire.parseFloat(),2);

ersetze, dann funktioniert alles prima... :smiley-roll-blue:

Hat jemand eine Idee woran das liegt? Kann ich Serial.println in der receiveEvent Funktion überhaupt fehlerfrei aufrufen?
Oder teilen sich die Serial und Wire Librarys irgendwelche Timer, sodass das Programm stecken bleibt???

Bin echt ratlos und wäre froh, wenn mir jemand helfen könnte.

Gruß

Jan

Go Up