verstehe ich richtig, dass du die Kommunikation zwischen beiden Nanos über I2C machen willst?
I2C ist dafür IMO nicht so gut geeignet wie UART, wenn es nur um 2 Teilnehmer geht, zum Einen wegen der Geschwindigkeit (UART ist schneller) und zum anderen wegen des Puffers (i2c:32bytes, UART:64bytes). Außerdem könntest du bei UART asynchron senden und empfangen, wenngleich ich es denoch nur per Handshake abwechselnd machen würde. Allerdings wäre bei UART noch dein I2C für angeschlossene Sensoren frei und würde hier nichts stören.
Vorteil allerdings bei i2c: es können mehrere Slaves angesprochen werden.
Aber das System wäre ähnlich:
du definierst dir einen Sende- und einen Empfangsarray, wo an bestimmten fest definierten Stellen bestimmte Datenbytes stehen.
Byte[0]: Start-Flag, z.B 0xff
(edit: ) ggf. letztes Byte: Ende-Flag, z.B. 0xfe
Byte[1]: Summe über alle Bytes vom Byte[2] bis zum letzten, davon nur das LSB, also (uint8_t)Summe oder Summe&0xff .
optional ein ack-Byte, ob die letzte Nachricht korrekt empfangen wurde (z.B. im Byte[2] 0xaa=OK, 0xee=ERROR; das nutze ich allerdings bei mir nicht mehr.)
Im Rest stehen dann die tatsächlich interessanten Daten-Bytes
Der Empfänger überprüft zunächst das Byte[0] aufs Start-Flag,
ggf auch das letzte Byte aufs Ende-Flag,
und dann die Checksum in Byte[1] über den Rest;
wenn alles ok, werden die Daten verwertet, ansonsten ignoriert.
Dann gibt er ein Antwort-Array zurück, analog aufgebaut (aktiv senden per UART oder für den Master bereitstellen per i2c).
Wenn du den Code für UART möchtest, kann ich ihn dir geben, für I2C könnte ich ihn u.U. auch noch haben.
(C++ Arduino zu Arduino oder Raspi C zu Arduino C++)
Lesezeichen