Frage zu Code im I2C-Beispiel

Hallo,
ich bin vor kurzem auf diesen Code gestoßen. Da fehlt mir in einem Abschnitt der Durchblick. Hoffe ihr könnt mir da helfen. Hab den Code unten gepostet.

#include <Wire.h>

void setup()
{
  pinMode(13,OUTPUT);
  
  Wire.begin(42); 
  Wire.onReceive(receiveEvent);
}

void lampenhardwaresteuerung(const byte nummer, const int helligkeit) {
  // hier fehlt die geheimnisvolle Hardwaresteuerung 
}

boolean schalten = false;
byte lampennummer = 0;
int helligkeit = 0;

void loop()
{
  if (schalten) {
    lampenhardwaresteuerung(lampennummer,helligkeit);
	schalten=false;
  }
}

void receiveEvent(int anzahl)
{
  if (anzahl!=3) {              // mehr oder weniger als 3 Bytes?
    while(Wire.available()){
      Wire.read();
    }	
    return;                     // schnell raus hier...
  }
  
  if (Wire.available()){
    lampennummer=Wire.read();
 
    if (Wire.available()){
      helligkeit=Wire.read();

	  if (Wire.available()){
        helligkeit=helligkeit+(Wire.read()<<8);
        schalten=true;
      }	
    }	
  }	
}

Für mich unverständlich ist die Methode “receiveEvent(int Anzahl)”. Der Autor schreibt dass er hier zuerst prüft, ob 3 Bytes angekommen sind. Falls nicht, verwirft er die Werte. Ich kann das allerdings nicht nachvollziehen, da

  1. receiveEvent ohne Parameter Anzahl aufgerufen wird.
  2. Anzahl niemals initialisiert wird

Meiner Meinung nach müsste man alle Werte in einem Buffer speichern und anschließend schauen, wie oft man erfolgreich gelesen hat.

Liege ich richtig oder hab ich nur “Tomaten auf den Augen” ?

Gruß,
UnoRookie

hi,

nö, nix tomaten.

Wire.onReceive(receiveEvent);

heißt: wenn etwas empfangen wird, soll die funktion receiveEvent mit der anzahl der empfangenen bytes als parameter aufgerufen werden. diese funktion rufst also nicht Du auf, sondern das passiert in der library. also mußt auch nicht Du den parameter mitgeben, sondern die library.

also: wenn "onReceive", dann ruft die library "receiveEvent(AnzahlDerEmpfangenenBytes);" auf.

gruß stefan

Also hab ich ja doch Tomaten auf den Augen, weil der Code funktioniert, oder ? :o :sob:

Vielen Dank stefan !

Ja, und Ja.
8)

hi,

da will man mal freundlich sein…

na ok, dann ehrlich: Du hast alles richtig gesehen, also keine tomaten auf den augen. :astonished:

Du hast es nicht verstanden, also eine tomate hinter den augen. :smiling_imp:

gruß stefan

UnoRookie:

  1. receiveEvent ohne Parameter Anzahl aufgerufen wird.
  2. Anzahl niemals initialisiert wird

Wenn Du Dich durch Wire.cpp durchwühlst, kommst Du über user_onReceive(numBytes); zu static volatile uint8_t twi_rxBufferIndex; in Wire\utility\twi.c.

Hilft Dir das weiter?