Forum: Mikrocontroller und Digitale Elektronik Arduino: Nach kleiner Änderung nicht mehr compilierbar


von Manfred (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe ein Ethernetmodul in Betrieb genommen und dazu ein Beispiel aus 
dem Paket EtherCard-master verwendet. Verwendet wird die IDE 1.7.4.

Das tut schon fast, was ich brauche, die Funktion soll aber nicht Inhalt 
der Frage sein!
1
// Demonstrates usage of the new udpServer feature.
2
// You can register the same function to multiple ports,
3
// and multiple functions to the same port.
4
// 2013-4-7 Brian Lee <cybexsoft@hotmail.com>
5
// License: GPLv2
6
7
// PIN Connections (Using Arduino UNO):
8
//   VCC -   3.3V
9
//   GND -    GND
10
//   SCK - Pin 13
11
//   SO  - Pin 12
12
//   SI  - Pin 11
13
//   CS  - Pin 10
14
15
06.04.2019 - erste Version mit Uno auf Testpappe
16
17
// String Version = "V 2019-04-07 22";
18
#include <EtherCard.h>
19
// #include <IPAddress.h>
20
21
// String Version = "V 2019-04-07 21";
22
23
#define STATIC 1  // 1 disable DHCP / 0 = DHCP
24
#if STATIC
25
static byte myip[] = { 192,168,177,255 }; // eigene IP
26
static byte gwip[] = { 192,168,177,198 }; // Gateway IP
27
static byte dnsip[] = { 8,8,4,4 }; // Nameserver
28
#endif
29
static byte mymac[] = { 0x70,0x69,0x69,0x2D,0x30,0x31 };
30
byte Ethernet::buffer[400]; // tcp/ip send and receive buffer
31
32
void setup(){
33
  //register udpSerialPrint() to port 514
34
  ether.udpServerListenOnPort(&udpSerialPrint, 514);
35
36
  Serial.begin(57600);
37
  Serial.println(F("UDP-Logger - mk"));
38
  Serial.println(Version);
39
40
// Change 'SS' to your Slave Select pin, if you arn't using the default pin
41
  if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0)
42
    Serial.println(F("Failed to access Ethernet controller"));
43
#if STATIC
44
  ether.staticSetup(myip, gwip, dnsip);
45
#else
46
  if (!ether.dhcpSetup())
47
    Serial.println(F("DHCP failed"));
48
#endif
49
50
  ether.printIp("IP:  ", ether.myip);
51
  ether.printIp("GW:  ", ether.gwip);
52
  ether.printIp("DNS: ", ether.dnsip);
53
} // Ende setup
54
55
void loop(){
56
  //this must be called for ethercard functions to work.
57
  ether.packetLoop(ether.packetReceive());
58
} // Ende loop
59
60
//callback that prints received packets to the serial port
61
void udpSerialPrint(uint16_t dest_port, uint8_t src_ip[IP_LEN], uint16_t src_port, const char *data, uint16_t len){
62
//  IPAddress src(src_ip[0],src_ip[1],src_ip[2],src_ip[3]);
63
64
//  Serial.print("dest_port: ");
65
//  Serial.println(dest_port);
66
//  Serial.print("src_port: ");
67
//  Serial.println(src_port);
68
//
69
//  Serial.print("src_ip: ");
70
//  ether.printIp(src_ip);
71
//  Serial.println("");
72
  Serial.println(data);
73
} // Ende udpSerialPrint

Wenn ich in Zeile 17 den Eintrag 'String Version = "V 2019-04-07 21";' 
einfüge, wird das Programm nicht übersetzt:
1
Verwende die Bibliothek EtherCard im Ordner: D:\Arduino_IDE\portable\sketchbook\libraries\EtherCard-master 
2
3
D:\Arduino_IDE/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10704 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -ID:\Arduino_IDE\hardware\arduino\avr\cores\arduino -ID:\Arduino_IDE\hardware\arduino\avr\variants\standard -ID:\Arduino_IDE\portable\sketchbook\libraries\EtherCard-master\src c:\tmp\build6258311819034784612.tmp\geht_nicht.cpp -o c:\tmp\build6258311819034784612.tmp\geht_nicht.cpp.o 
4
geht_nicht.ino:20:56: error: 'IP_LEN' was not declared in this scope
5
geht_nicht.ino:20:63: error: expected ')' before ',' token
6
geht_nicht.ino:20:74: error: expected initializer before 'src_port'
7
geht_nicht.ino: In function 'void setup()':
8
geht_nicht.ino:34:51: error: invalid conversion from 'void (*)(...)' to 'UdpServerCallback {aka void (*)(unsigned int, unsigned char*, unsigned int, const char*, unsigned int)}' [-fpermissive]
9
In file included from geht_nicht.ino:18:0:
10
D:\Arduino_IDE\portable\sketchbook\libraries\EtherCard-master\src/EtherCard.h:324:17: error:   initializing argument 1 of 'static void EtherCard::udpServerListenOnPort(UdpServerCallback, uint16_t)' [-fpermissive]
11
     static void udpServerListenOnPort(UdpServerCallback callback, uint16_t port);
12
                 ^
13
Fehler beim Kompilieren.

Schreibe ich das hinter mein include in Zeile 21, ist alles gut!

Was passiert da, sieht mir irgendwie so aus, als ob da Variablentypen 
durcheinander kommen / inkompatibel sind?

Im Anhang beide .ino, im Ordner 'geht nicht' bzw. 'geht'!

von Dirk B. (dirkb2)


Lesenswert?

Was ist mit Zeile 15?

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Zugegeben ich hab von der Arduino IDE nicht die geringste Ahnung, aber 
woher kennt der Compiler in Zeile 17 den Datentyp String?
In Zeile 21 könnte er den indirekt über EtherCard.h kennen.

Nur mal so als Idee...

von Einer K. (Gast)


Lesenswert?

Manfred schrieb:
> 06.04.2019 - erste Version mit Uno auf Testpappe

Du meinst:
// 06.04.2019 - erste Version mit Uno auf Testpappe
Dann kompiliert es bei mir.

von Stefan F. (Gast)


Lesenswert?

Erst kommen die includes, dann alles Andere. Denn Denn in den 
inkludierten Dateien sind die Typen der Objekte (z.b. String) definiert.

von Alex G. (dragongamer)


Lesenswert?

Bin kein Profi für C aber was kann es für Gründe geben, eine Variable 
vor dem include<XXX.h> definieren zu wollen?
.h(eader) Dateien kommen immer zuerst damit der Compiler die 
Programmstruktur kennt und darauf aufbauend, Funktionen und Variablen 
mit Werten füllt.

von Manfred (Gast)


Lesenswert?

Dirk B. schrieb:
> Was ist mit Zeile 15?

Das ist eine Kommentarzeile und wird ignoriert.

Arduino Fanboy D. schrieb:
> Du meinst:
> // 06.04.2019 - erste Version mit Uno auf Testpappe
> Dann kompiliert es bei mir.

In "geht" und "geht_nicht" ist der Eintrag im Zeile 15
// 06.04.2019 - erste Version mit Uno auf Testpappe
identisch. Der Unterschied sind nur Zeilen 17 und 21, der String vor 
oder  nach dem include.

Wenn ich bei "geht_nicht" den Kommentar Zeile 15 entferne, bleibt es 
beim Abbruch.

Stefanus F. schrieb:
> Erst kommen die includes, dann alles Andere. Denn Denn in den
> inkludierten Dateien sind die Typen der Objekte (z.b. String) definiert.

Ich verstehe nicht, was Du mir sagen willst, Datentypen wie String, int, 
etc. kennt Arduino doch von Haus aus, ohne jegliche includes.

Ich habe hier diverse Programme, wo ich 'String Version' als allerersten 
Eintrag habe, vor meinen includes, die meckern nicht.

von Einer K. (Gast)


Lesenswert?

Manfred schrieb:
> Ich verstehe nicht, was Du mir sagen willst, Datentypen wie String, int,
> etc. kennt Arduino doch von Haus aus, ohne jegliche includes.

Vom Arduino Builder wird (heimlich) Arduino.h eingebunden.
Über diese steht dann auch schon ganz zu Anfang die String Klasse zur 
Verfügung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.