Go Down

Topic: <Wire.h> "onReveive()" Funktion auslagern  (Read 70 times) previous topic - next topic

dadude1105

Oct 25, 2020, 05:37 pm Last Edit: Oct 25, 2020, 05:49 pm by dadude1105
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.

HotSystems

Und wie war deine Frage gleich ?
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

combie

#2
Oct 25, 2020, 05:56 pm Last Edit: Oct 25, 2020, 06:05 pm by combie
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()
{

}
Ein schwarzes Schaf, zur rechten Zeit, erspart den Streit, bringt Einigkeit.

HotSystems

Achso....dein Beitrag war noch nicht fertig, na dann.....
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Go Up