Arduino Forum

International => Deutsch => Topic started by: dadude1105 on Oct 25, 2020, 05:37 pm

Title: <Wire.h> "onReveive()" Funktion auslagern
Post by: dadude1105 on Oct 25, 2020, 05:37 pm
Einen schönen guten Abend zusammen,

ich habe eine kleine Wissenslücke und weis momentan leider nicht wo ich nachschauen muss um diese zu "schließen". Entsprechend bräuchte ich eure Hilfe um wieder auf den richtigen Weg zu kommen.
Zunächst würde ich gerne eine I2C Kommunikation zwischen zwei Arduinos aufbauen. Normalerweise wird das relativ einfach und der Slave würde folgenden vereinfachten Code bekommen:
Code: [Select]

#include <Wire.h>
const int ClientNr = 3;

void receive()
{   
    Serial.print("Daten empfangen");
}

void setup()
{
    Wire.begin(ClientNr);
    Serial.begin(4800);
    Wire.onReceive(receive);
}
void loop()
{
           //Do nothing
}

Soweit so gut. Sobald der Slave angesprochen ist ruft er die Funktion request() auf welche vorher definiert wurde.

Nun würde ich das gesamte Handling der Kommunikation aber gerne in eine Klasse verlagern.
.h Datei:
Code: [Select]

class CommunicationTrial
{
public:
CommunicationTrial(int busNo);
void init();
private:
        void m_onReceive(int amount_of_Bytes);
};

.cpp Datei:
Code: [Select]

#include "CommunicationTrial.h"
#include <Arduino.h>
#include <Wire.h>

CommunicationTrial::CommunicationTrial(int busNo) :
m_busNo(busNo)
{
  //Do nothing
}

void CommunicationTrial::init()
{
Wire.begin(m_busNo);
Wire.onReceive(m_onRecieve);
}

Problem ist nun, dass die Wire.onReceive() Funktion hier keine Memberfunktion aufrufen kann. Meine Frage an euch wäre nun wie ich es am elegantesten hinbekommen, dass dies doch funktioniert.
Title: Re: Wire.h-Funktionen auslagern
Post by: HotSystems on Oct 25, 2020, 05:43 pm
Und wie war deine Frage gleich ?
Title: Re: <Wire.h> "onReveive()" Funktion auslagern
Post by: combie on Oct 25, 2020, 05:56 pm
Quote
Wire.onReceive() Funktion hier keine Memberfunktion aufrufen kann.
Eine statische Memberfunktion kann man schon aufrufen, ist aber mit Nebenwirkungen verbunden.

Mein Tipp:
Eine Lambdafunktion als Wrapper einsetzen.

Code: [Select]
#include <Wire.h>

class Test
{
  public:
  void receiveA(int)
  {
    Serial.print("Daten empfangen");
  }
 
  static void receiveB(int)
  {
    Serial.print("Daten empfangen");
  }
};

Test test;


void setup()
{
  Serial.begin(9600);
  Wire.begin(42);
  Wire.onReceive([](int n){test.receiveA(n);}); // empfehlung
//   Wire.onReceive(Test::receiveB); // nicht so schoen
}

void loop()
{

}
Title: Re: <Wire.h> "onReveive()" Funktion auslagern
Post by: HotSystems on Oct 25, 2020, 06:10 pm
Achso....dein Beitrag war noch nicht fertig, na dann.....