I2C - Wire.write und Wire.read Probleme

Hallo, ich würde gerne einen String per I2C an einem Host Arduino übertragen.
Der Inhalt der Variable ist abhängig vom Sensor und hat Integer Werte zwischen 0 - max. 25000. Da ich bei der Übertragung gemerkt habe, dass es mit einem Integer Wert nicht funktioniert, wollte ich einen String-Wert übergeben.

Wenn ich einen Integer Variable genommen hätte, habe ich am Host-Arduino nur Werte bis 245 erhalten, obwohl der übertragene Wert deutlich höher war. Daher bin ich zu einem String rüber gegangn.

Code für Sender Arduino

....
void Setup(){
  Wire.begin();

}

void Loop(){
  Wert=LeseSensor();           // Gibt einen String Wert zurück
  Wire.beginTransmission(4);
  Wire.write(Wert.c_str());
  Wire.endTransmission();
  delay(50);
}
Code für Empfänger:

String Ausgabe;

void Setup(){
Wire.onReceive(receiveEvent);
Wire.begin(4);

}

void receiveEvent(int howMany){
  Ausgabe=Wire.read();
}

am Empfänger bekomme ich nur 1-2 Zeilen einen Wert von 48. Und dann kommt nichts meh. Woran könnte das liegen?

void receiveEvent(int howMany)
{
  for(int i =0 ; i< howMany; i++)  Ausgabe +=char(Wire.read());
}

ungetestet

  1. ich mag die Stringklasse nicht
  2. Bedenke, dass receiveEvent() im Interrupt aufgerufen wird.

Ja, du könntest mit char Arrays arbeiten.
Den so genannten c Strings.

Da ich bei der Übertragung gemerkt habe, dass es mit einem Integer Wert nicht funktioniert,

Das funktioniert mit allen Werten gleich gut!
Solange sie kleiner, als 33 Byte sind.

volatile char Ausgabe[100];

void receiveEvent(int howMany)
{
  char * ptr =  Ausgabe;
  for(int i =0 ; i< howMany; i++) *ptr++=Wire.read();
  *ptr = 0;
}

auch ungetestet

Warum überträgst Du den Wert nicht binär, wie ursprünglich versucht? Du mußt nur beide Bytes des int übertragen.

Das frage ich mich auch....
Aber vielleicht ist das nicht kompliziert genug.

Man braucht doch nur den Integer-Wert in 2 Bytes zerlegen und dann senden.
Das low-Byte = Wert&255 (meistens gehts auch ohne &255)-
Das high-Byte = Wert>>8, die oberen 8 Bit werden nach unten geschoben und dann übergeben.
Habe deinen Code mal bisserl abgeändert, musst deine Routine “LeseSensor()” wieder auf integer ändern:

//Code für Sender Arduino

....
void Setup(){
  Wire.begin();

}

void Loop(){
  int Wert=LeseSensor();           // Gibt einen Integer Wert zurück
  Wire.beginTransmission(4);
  Wire.write(Wert&255);
  Wire.write(Wert>>8);
  Wire.endTransmission();
  delay(50);
}

Der Empänger muss die 2 Bytes dann wieder zu einem Integer zusammenstöpseln:

//Code für Empfänger:

int Ausgabe;

void Setup(){
Wire.onReceive(receiveEvent);
Wire.begin(4);

}

void receiveEvent(int howMany){
  Ausgabe=Wire.read() | Wire.Read()<<8;
}

Falls du verschiedene Arten von Daten senden willst empfehle ich diese mit Steuercodes als erstes Byte zu versehen.
Z. B. beim Empfänger mit
switch(wire.read());
case 1:

break;

case 2:

break;

Der Sender sendet diese dann einfach vor den eigentlichen Daten.

MfG
Andi