i2C "Master" soll Array an "Slave" senden

Guten Morgen an alle.

Ich sitze hier gerade und probiere mich an i2C aus.
Eine Kommunikation zwischen Master und Slave bekomme ich hin.

Im Netz habe ich auch ein Beispiel gefunden, wie ich ein Array vom „Slave“ an den „Master“ sende und auswerte, das funktioniert auch gut.

Aber ich finde nichts im Netz wie der „Master“ an den „Slave“ ein Array verschickt und der Slave das auswertet.

Ich dachte ich kann das umgekehrt aufbauen, aber ich bekomme es nicht hin, bzw. mein Verständnis macht da noch nicht mit.

Habt ihr eine Idee, wo/wie ich einen Ansatz finde.
Mein Ansatz (für den Master) sieht so aus... aber das wird nichts:

Master:

#include <Wire.h>
byte Array[3];

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

void loop()
{
  Array[0] = 1;
  Array[1] = 0;
  Array[2] = 1;

Wire.beginTransmission(80);
Wire.write((byte*)Array,sizeof(Array));
Wire.endTransmission();
}

Grüße und danke schonmal im Voraus für die Unterstützung.

Master
Ja, die sizeof(Array) ist gut.

Slave

volatile byte Array[3];
volatile bool newData = false;

void receiveEvent(int howMany)
{
  if(howMany == 3)  // 3 oder sizeof(Array)
  {
    for(int i=0; i<3; i++)  // 3 oder sizeof(Array) oder howMany
    {
      Array[i] = Wire.read();
    }
    newData = true;
  }
}

oder:

void receiveEvent(int howMany)
{
  if(howMany == 3)
  {
    Wire.readBytes( Array, 3);
    newData = true;
  }
}

und:

void loop()
{
  if(newData)
  {
    for(int i=0; i<3; i++)
    {
      Serial.println(Array[i]);
    }
    Serial.println();
    newData = false;
  }
}
1 Like

Oh Danke.
Wenn ich das übernehme dann bekomme ich eine Fehlermeldung (Zeile 34) :
"exit status 1
'Array' was not declared in this scope"

Warum ?

Slave


#include <Wire.h>
volatile byte Array[3];
volatile bool newData = false;

void setup() 
{
Wire.begin(80); // Slave Adresse
Wire.onReceive(receiveEvent);
Serial.begin(9600);


}


void loop()
{
  if(newData)
  {
    for(int i=0; i<3; i++)
    {
      Serial.println(Array[i]);
    }
    Serial.println();
    newData = false;
  }
}


void receiveEvent(int howMany)
{
  if(howMany == 3)
  {
    Wire.readBytes( Array, 3);
    newData = true;
  }
}

Array Variablen zerfallen bei der Übergabe an Funktionen automatisch auf Zeiger auf das erste Element. Bei einem Byte Array ist der Cast daher überflüssig. Das ist dann schon ein byte*.
Ich nehmen mal an den Code hast du von einem Beispiel bei dem ein Array eines anderen Datentyps verwendet wurde (z.B. int oder float). Dann braucht man das.

Schadet zwar nichts wenn das dort steht (und man kann den Datentyp des Arrays leicht ändern), aber du solltest verstehen was das macht

Wenn es beim Master gut ist, wäre aus es auf dem Slave auch gut :slight_smile:

Die Wire.readBytes() möchte gerne eine pointer sehen, und nicht eine "volatile" array.
Wire.readBytes( (byte *) Array, 3);
Wire.readBytes( (char *) Array, 3);

Naja, auch hier ist das nötig!
Siehe:

exit status 1
no matching function for call to 'write(volatile byte [3], unsigned int)'

Keine Ahnung...
Bei mir tut das!

Natürlich mit Wire.readBytes((byte*)Array, 3); denn auch hier ist der Cast notwendig.

1 Like

@combie
Du Fuchs :smiley:
Mal gucken ob es funktioniert :smiley:
Ich melde mich später.

Nee, dann schon eher eine Konifere :japanese_ogre:
:upside_down_face: nix Koryphäe :upside_down_face:

1 Like

Danke an ALLE :slight_smile:
Es Funktioniert genauso wie ich es mir vorgestellt habe.
Ihr seid wie immer super hilfsbereit.

lieben lieben Dank

Eine letzte Frage noch am Rande.. wie viel kann ich max. in das "Array" reinschreiben?
Geht auch "Array[80]" ?

Grüße

Erstmal ist Array eine Variable, und sollte darum mit einem Kleinbuchstaben anfangen.
Also: array

Aber das ist nicht wirklich wichtig, würde nur die "Schönheit" in meinen Augen steigern.

Naja...
Dem Array macht das nichts.
Aber Wire kann nur 32 Byte Häppchen übertragen.
Du wirst den 80 Byte großen Klumpen also fragmentieren müssen.

2 Likes

OK danke, das werde ich in Zukunft beherzigen. :slight_smile:

Ein Linit ist wie schon geschrieben die Übertragung via I2C.
Das andere Limit ist der verfügbare RAM-Speicherplatz. Dadei Achtung: Variablen verbrauchen RAM während der Laufzeit des Sketches aber auch der Stack und auch andere Prozesse wie zB ein print eines Textes ohne das F() Makro.

Grüße Uwe

1 Like