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.
Koepel
September 8, 2021, 7:44am
2
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
Koepel
September 8, 2021, 8:54am
5
Die Wire.readBytes() möchte gerne eine pointer sehen, und nicht eine "volatile" array.
Wire.readBytes( (byte *) Array, 3);
Wire.readBytes( (char *) Array, 3);
combie
September 8, 2021, 8:55am
6
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
Mal gucken ob es funktioniert
Ich melde mich später.
combie
September 8, 2021, 9:14am
8
ardouinee:
Du Fuchs
Nee, dann schon eher eine Konifere
nix Koryphäe
1 Like
Danke an ALLE
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
combie
September 8, 2021, 10:06am
11
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.
ardouinee:
Geht auch "Array[80]" ?
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.
uwefed
September 8, 2021, 3:54pm
13
ardouinee:
Geht auch "Array[80]" ?
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
system
Closed
January 6, 2022, 3:55pm
14
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.