Arduino: Nach kleiner Änderung nicht mehr compilierbar

Gast #5800640
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'!
Angehängte Dateien:
Gast #5800651
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...
Gast #5800750
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.
Gast #5800758
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren