Forum: Mikrocontroller und Digitale Elektronik I2C Slave Receiver Problem Arduino


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Fabian G. (fabian_s51)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich konnte den Beispiel Sketch(slave_receiver) ohne Probleme 
kompilieren,
doch wenn ich den nachfolgenden Sketch kompiliere kommt folgende 
Meldung(auch mit copy and paste aus dem Beispiel Sketch):


C:\Users\Fabian\Documents\Arduino\SimsonV3Slave\sketch_dec05a\sketch_dec 
05a.ino:  In function 'void setup()':
sketch_dec05a:35:18: error: 'receiveEvent' was not declared in this 
scope
   Wire.onReceive(receiveEvent); // register event
                  ^~~~~~~~~~~~
C:\Users\Fabian\Documents\Arduino\SimsonV3Slave\sketch_dec05a\sketch_dec 
05a.ino:  In function 'void loop()':
sketch_dec05a:109:32: error: a function-definition is not allowed here 
before '{' token
 void receiveEvent(int HowMany) {
                                ^
sketch_dec05a:114:1: error: expected '}' at end of input
 }
 ^
Bibliothek Wire in Version 1.0 im Ordner: C:\Program 
Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hard 
ware\arduino\avr\libraries\Wire   wird verwendet
exit status 1
'receiveEvent' was not declared in this scope

1
const int blinkenrechts = 4 ;//oben K4
2
const int blinkenlinks = 5 ;//oben K3
3
const int standlicht = 3 ;//obenK2
4
const int ruecklicht = 2 ;//oben K1
5
const int fernlicht = 9 ;//unten K4
6
const int bremslicht = 8 ;//unten K3
7
const int regler = 7 ;//unten K2
8
const int zuendung = 6 ;//unten K1
9
const int batterie = 14 ;
10
const int anlasser = 16;
11
const int hupe = 17;
12
13
int a1 = 0;
14
int a2 = 0;
15
int a = 0;
16
17
18
#include <Wire.h>
19
20
void setup() {
21
  // put your setup code here, to run once:
22
 
23
  pinMode( blinkenrechts , OUTPUT);  
24
  pinMode( blinkenlinks , OUTPUT); 
25
  pinMode( standlicht , OUTPUT);
26
  pinMode( ruecklicht , OUTPUT); 
27
  pinMode( fernlicht , OUTPUT);
28
  pinMode( bremslicht , OUTPUT);
29
  pinMode( regler , OUTPUT);
30
  pinMode( zuendung , OUTPUT);
31
  pinMode( batterie , OUTPUT);
32
  pinMode( anlasser , OUTPUT);
33
  pinMode( hupe , OUTPUT); 
34
  Wire.begin(8);                // join i2c bus with address #8
35
  Wire.onReceive(receiveEvent); // register event
36
  Serial.begin(9600);           // start serial for output
37
}
38
39
void loop() {
40
  // put your main code here, to run repeatedly:
41
 if (a1 = a)
42
  {}
43
  else
44
  { a1 = a;
45
    a2 = a;
46
    if (a2 >= 128)
47
    { a2 = a2 - 128;
48
      digitalWrite(zuendung , HIGH);
49
      digitalWrite(batterie , HIGH);
50
      digitalWrite(regler , HIGH);
51
    }
52
    else
53
    { digitalWrite(zuendung , LOW);
54
      digitalWrite(batterie , LOW);
55
      digitalWrite(regler , LOW);
56
    }
57
    if (a2 >= 64)
58
    { a2 = a2 - 64;
59
      bool rfstatus = HIGH;
60
    }
61
    else
62
    { bool rfstatus = LOW;
63
    }
64
    if (a2 >= 32)
65
    { a2 = a2 - 32;
66
      digitalWrite(bremslicht , HIGH);
67
    }
68
    else
69
    { digitalWrite(bremslicht , LOW);
70
    }
71
    if (a2 >= 16)
72
    { a2 = a2 - 16;
73
      digitalWrite(fernlicht , HIGH);
74
    }
75
    else
76
    { digitalWrite(fernlicht , LOW);
77
    }
78
    if (a2 >= 8)
79
    { a2 = a2 - 8;
80
      digitalWrite(blinkenlinks , HIGH);
81
    }
82
    else
83
    { digitalWrite(blinkenlinks , LOW);
84
    }
85
    if (a2 >= 4)
86
    { a2 = a2 - 4;
87
      digitalWrite(blinkenrechts , HIGH);
88
    }
89
    else
90
    { digitalWrite(blinkenrechts , LOW);
91
    }
92
    if (a2 >= 2)
93
    { a2 = a2 - 2;
94
      digitalWrite(hupe , HIGH);
95
    }
96
    else
97
    { digitalWrite(hupe , LOW);
98
    }
99
    if (a2 >= 1)
100
    { a2 = a2 - 1;
101
      bool leerlaufstatus = HIGH;
102
    }
103
    else
104
    { bool leerlaufstatus = LOW;
105
    }
106
       Serial.println(a );
107
}
108
109
void receiveEvent(int HowMany) {
110
111
    int a = Wire.read();
112
    
113
114
}

Wenn die Formatierung oder andere Sachen unstimmig sind, bitte einfach 
mitteilen, dann ändere ich das.
Danke

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Fabian G. schrieb:
> doch wenn ich den nachfolgenden Sketch kompiliere kommt folgende
> Meldung(auch mit copy and paste aus dem Beispiel Sketch): ...

Dann stellt sich die klare Frage:
Wo hast du receiveEvent deklariert?
Existiert die Deklaration nicht oder findet der Compiler sie nur nicht.

von Fabian G. (fabian_s51)


Bewertung
0 lesenswert
nicht lesenswert
Wo müsste receiveEvent deklariert werden?
Ich habe lediglich Teile des Beispiel Sketches übernommen.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Fabian G. schrieb:
> Wo müsste receiveEvent deklariert werden?

Im Sketch, wo denn sonst? Ab besten vor der Stelle, wo es gebraucht 
wird.

von Fabian G. (fabian_s51)


Bewertung
0 lesenswert
nicht lesenswert
Entschuldigung, aber wie wird receiveEvent deklariert?
Ich habe void receiveEvent in den letzten Zeilen des Sketches und 
Wire.onReceive(receiveEvent) im Setup.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Nochmal:

Stefan ⛄ F. schrieb:
> Am besten vor der Stelle, wo es gebraucht wird.

Weil der Compiler die Datei von oben nach unten abarbeitet.

Du kannst deiner Frau nach dem IKEA Einkauf auch nicht sagen, stell mal 
ein Bier auf den Tisch obwohl der Tisch noch nicht aufgebaut ist.

von Fabian G. (fabian_s51)


Bewertung
-1 lesenswert
nicht lesenswert
Danke, ich hab es jetzt,

void reseiveEvent muss vor void loop,
damit der compiler einen direkten Bezug herstellen kann.

korrigiert mich wenn ich falsch liege. :)

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Der Kandidat hat 100 Gummipunkte gewonnen.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Stefan ⛄ F. schrieb:
> Du kannst deiner Frau nach dem IKEA Einkauf auch nicht sagen, stell mal
> ein Bier auf den Tisch obwohl der Tisch noch nicht aufgebaut ist.

Dem C Compiler würde es genau genommen genügen, wenn er vorher die 
genauen Abmessungen des Tisches kennt. Denn erst der Linker fügt alle 
Teule zu einem lauffähigen Programm zusammen und erst danach wird es 
ausgeführt.
1
void receiveEvent(int HowMany);
2
3
Wire.onReceive(receiveEvent);
4
5
void receiveEvent(int HowMany) 
6
{
7
    int a = Wire.read();   
8
}

: Bearbeitet durch User
von Einhart P. (einhart)


Bewertung
0 lesenswert
nicht lesenswert
Dein wirkliches Problem: Du hast die geschweifte Klammer am Ende der 
Loop vergessen.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Einhart P. schrieb:
> Dein wirkliches Problem: Du hast die geschweifte Klammer am Ende der
> Loop vergessen.

Man sollte den Quelltext vielleicht mal anständig formatieren, dann 
sieht man das auch sofort. Nicht umsonst haben alle IDE (auch Arduino) 
dazu eine Auto-Format Funktion.

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.