Go Down

Topic: Problem mit Libery (Read 4223 times) previous topic - next topic

woehrer

Code: [Select]


/*
* Arduino WakeMyPc
* Ricardo Dias
* http://ricardo-dias.com/
*
* This sketch sends the "magic packet" to wake up
* a PC on Local Area Network when a push-button
* is pressed.
*/
#include <Ethernet.h>

#include <UdpRaw.h>


// ARDUINO CONFIG
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Arduino MAC
byte ip[] = { 192, 168, 2, 145 }; // Arduino IP
byte gateway[] = { 192, 168, 2, 1 }; // Gateway IP address
int localPort = 8888; //local port to listen on

// THE TARGET
byte targetIp[] = { 192, 168, 2, 114 };
int targetPort = 5456;
byte wolMac[] = { 0x20,0x89,0x84,0x61,0xCA,0x41 }; // The target PC Mac Address

void setup() {
  Ethernet.begin(mac,ip,gateway);
  UdpRaw.begin(localPort);

  // Will run the sendPkt() function when a button wired to
  // pin 2 is pressed
  attachInterrupt(0, sendPkt, RISING);
}

void loop() {
  delay(1);
}

void sendPkt(){
  // The 'magic packet' consists of 6 times 0xFF followed by 16 times
  // the hardware address (MAC).

  byte all[102];
  int i,c1,j=0;

  for(i = 0; i < 6; i++,j++){
    all[j] = 0xFF;
  }
  for(i = 0; i < 16; i++){
    for( c1 = 0; c1 < 6; c1++,j++)
      all[j] = wolMac[c1];
  }

  UdpRaw.sendPacket(all,102,targetIp,targetPort);
}



In file included from C:\Users\Julian\Documents\Arduino\libraries\Ethernet\Dhcp.cpp:4:
C:\Users\Julian\Documents\Arduino\libraries\Ethernet\/w5100.h: In static member function 'static void W5100Class::setSS()':
C:\Users\Julian\Documents\Arduino\libraries\Ethernet\/w5100.h:365: error: 'cli' was not declared in this scope
C:\Users\Julian\Documents\Arduino\libraries\Ethernet\/w5100.h: In static member function 'static void W5100Class::resetSS()':
C:\Users\Julian\Documents\Arduino\libraries\Ethernet\/w5100.h:366: error: 'sei' was not declared in this scope


Was mache ich falsch?

SkobyMobil

Hallo,
das

"C:\Users\Julian\Documents\Arduino\libraries\Ethernet\/w5100.h:365: error: 'cli' was not declared in this scope"

ist fast immer- Lib falsch/ an falschen "Ort" installiert.
Gruß und Spaß
Andreas
die zweite Maus bekommt den Speck...

jurs


Was mache ich falsch?


Welche Arduino-Softwareversion hast Du installiert?
Wie lautet der Pfad, in den Du das startbare Arduino-Programm installiert hast?
Lassen sich bei Dir die Beispielprogramme zur Ethernet-Library  ("Datei-Beispiele-Ethernet") fehlerfrei kompilieren?

woehrer

Habe es probiert andere Ethernet Programme gehen auch nicht.
Verwende die Version 1.0.5
Wo soll die den instaliert sein?
Momentag ist sie unter C:/Programme/Arduino

Serenifly


woehrer


Im libraries Ordner.

Was im libraries Ordner?
Das da die Libraries rein gehören weis ich selber aber wohin mit dem Programm?

jurs


wohin mit dem Programm?


Ich weiß nicht, wie es unter Windows vorgesehen ist, aber wenn Du auf Deiner Windows-Installation als "Eingeschränkter Benutzer" angemeldet bist, dann bist Du bei der Arduino-Software auf der sicheren Seite, wenn Du die Software nicht unter C:/Programme installierst, wo Du bei neueren Windowsversionen keinen Datei-Vollzugriff mehr hast. Sondern wenn Du einen Pfad wählst, unter dem der angemeldete User Datei-Vollzugriff hat, also unterhalb Deines User-Ordners.

Bei mir liegt die Arduino-Software unter dem Usernamen abgelegt und ich installiere NICHT aus der Installer-Datei, sondern lade die ZIP-Datei herunter und installiere daraus.

Wenn Du mit dem Namen "XYZ" angemeldet bist, hast Du auf dem Desktop bei WIN7 standardmäßig ein Userordnersymbol "XYZ" liegen. Oder wenn Du über den Windows-Startbutton und "Computer-Benutzer-XYZ" gehst, wird als Verzeichnis angezeigt:
C:\Users\XYZ
Dort installierst Du dann die Arduino-Software in der gewünschten Version, Du kannst mehrere Versionen parallel installiert haben:
C:\Users\XYZ\arduino-1.0.3
C:\Users\XYZ\arduino-1.0.5
C:\Users\XYZ\arduino-1.5.6-r2

Dein Sketch-Verzeichnis, wo dann die Sketche hin installiert werden, wird dann standardmäßig im "Eigene Dokumente"-Ordner angelegt, also z.B.:
C:\Users\XYZ\Documents\Arduino
Diesen Ordner kannst Du dann aber selbst frei einstellen und auswählen.

Wichtig ist insbesondere, dass der "Sketchordner", in dem die Sketche abgespeichert werden, NICHT identisch ist mit dem Ordner, in dem die Software installiert ist. Und dass der Anwender auf alle Dateien Datei-Vollzugriff hat, was insbesondere für Windowsinstallationen als "Eingeschränkter Benutzer" wichtig ist.

Mit dieser manuellen Installation aus dem ZIP funktioniert es jedenfalls immer.
Die Installer-Version und wo und wie das Programm damit installiert wird, habe ich nicht getestet.

An Deiner Programminstallation scheint jedenfalls krumm zu sein, dass Du mitgelieferte Standard-Libraries ("Ethernet") in dem Verzeichnis instaliert hast, in dem eigentlich nur zusätzliche User-Libraries von Drittanbietern installiert sein sollten.
C:\Users\Julian\Documents\Arduino\libraries\Ethernet\
Die Ethernet-Library sollte dort meines Wissen nach nicht liegen. Entweder hast Du die Software mehrfach installiert, nicht nur unter Programme, sondern auch nochmal unter "Eigene Dokumente". Oder Du hast eine zusätzliche Library gleichen Namens nochmal extra installiert. Wenn Du das Programm nochmal manuell neu installierst so wie oben vorgeschlagen, verwende als Sketch-Ordner bitte nicht "C:\Users\Julian\Documents\Arduino\" sondern einen anderen Ordner. Oder lösche im Verzeichnis C:\Users\Julian\Documents\Arduino\libraries\ alle Libraries raus, die dort nicht hingehören.

woehrer

Hab jetzt lang rumprobiert und bin jetzt bei folgenden zwei Fehlern angelangt.
Vllt kann mir da jemand weiter helfen


In file included from Wake_up_on_lan.ino:7:
C:\Users\Julian\Desktop\Programm\Arduino\libraries\Ethernet/UdpBytewise.h:70: error: conflicting return type specified for 'virtual void UdpBytewiseClass::write(uint8_t)'
C:\Users\Julian\Desktop\Programm\Arduino\hardware\arduino\cores\arduino/Print.h:48: error:   overriding 'virtual size_t Print::write(uint8_t)'

jurs


C:\Users\Julian\Desktop\Programm\Arduino\libraries\Ethernet/UdpBytewise.h:70: error: conflicting return type specified for 'virtual void UdpBytewiseClass::write(uint8_t)'


Kannst Du denn jetzt die Beispiele zur Ethernet-Library fehlerfrei kompilieren?
Wenn nein, mußt Du erstmal das Problem in Ordnung bringen!

Wenn ja, ist augenscheinlich Deine Library nicht kompatibel zur aktuellen Arduino-Version.

Hast Du dann mal probiert, in Zeile 70 der genannten Datei UdpBytewise.h und der dazugehörigen cpp-Datei die Deklaration von "uint8_t" nach "byte" zu ändern?

woehrer

Habe es durch byte ersetzt jetzt bekomme ich folgenden Fehler

C:\Users\Julian\Documents\Arduino\libraries\Ethernet/UdpBytewise.h:49: error: 'byte' does not name a type

Die Beispiel Programme funktionieren

Serenifly

Der Parameter ist nicht das Problem. Hier überschreibt eine Klasse eine Methode der Basisklasse, aber hat einen anderen Rückgabewert. Die eine Methode gibt einen size_t zurück und die andere nichts.

woehrer

#11
Mar 26, 2014, 01:44 pm Last Edit: Mar 26, 2014, 02:14 pm by woehrer Reason: 1
Nur welche Klasse ist das?
Ich hab jetzt schon verschwidene Versionen von libraries versucht.
Habe das Programm schon zweimal an verschiedenen Orten instaliert und Deinstalliert.
Mich würd mich interesieren funktionierts bei jemand anderem?
Habe gerade keine andere Hardware zum es testen

Trotzdem würd ich den Fehler gern finden und beheben

edit: In UdpBytewise.h Zeile 70 wird "uint8_t" verwendet
und in print.h Zeile 48 auch.

jurs


Habe es durch byte ersetzt jetzt bekomme ich folgenden Fehler

C:\Users\Julian\Documents\Arduino\libraries\Ethernet/UdpBytewise.h:49: error: 'byte' does not name a type

Die Beispiel Programme funktionieren


Was ist denn das jetzt wieder für eine Installation?

Wenn das Programm im Pfad
C:\Users\Julian\Desktop\Programm\Arduino\
installiert ist, dann ist die Ethernet-Library unter
C:\Users\Julian\Desktop\Programm\Arduino\libraries\Ethernet
vollkommen richtig. Soweit OK, das ist die mitgelieferte Ethernet-Library.

Aber wo kommt die Ethernet-Library in diesem Pfad her:
C:\Users\Julian\Documents\Arduino\libraries\Ethernet/
???

In dem Pfad unter "Documents" liegt der Sketch-Ordner, und da dürfen unter "libraries" nur ZUSÄTZLICHE LIBRARIES VON DRITTANBIETERN enthalten sein. Und mit diesen Libraries darf es KEINEN NAMENSKONFLIKT mit den Libraries geben, die bei der Arduino-Software schon mitgeliefert werden, so wie z.B. Ethernet.
C:\Users\Julian\Desktop\Programm\Arduino\libraries\Ethernet
C:\Users\Julian\Documents\Arduino\libraries\Ethernet

Der Namenskonflikt ist doch offensichtlich: Zweimal eine Library mit dem Namen Ethernet. Einmal die "original" Ethernet-Library, die zur Arduino-Software gehört.

Oder einmal irgendwelcher dazukopierter Dreck bei \Documents\Arduino\libraries\Ethernet

Das ist ein absolutes No-Go, dass Du in einer Softwareinstallation zwei verschiedene, namensgleiche Libraries an verschiedenen Orten gespeichert hast, die im Suchpfad des Compilers und Linkers liegen.

Das mit dem Ethernet kennt man doch aus dem Kinofilm "Highlander": Es kann nur einen geben...
In diesem Fall: Nur EINEN Library-Ordner mit dem Namen "Ethernet" in einer Arduino-Softwareinstallation.

woehrer

Das zweite Ethernet ist extern das ist bei der Standard installation nicht dabei.
Darin befindet sich zb. die  <UdpBytewise.h> wenn ich den ordner anderst nenn ändert sich nix.
Aber ich hab den Namenskonflikt dadrin das stimmt
jetzt muss ich mir mal überlegen wie ich den da raus bekomm

mkl0815

Wie wäre es, wenn Du die externe Lib einfach weg lässt?
Wenn ich das richtig sehe willst Wake on LAN Pakete senden, das geht super mit der vorhandenen Ethernet Library:
Code: [Select]

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

...

/**********************************************************************
* send out an Wake-on-LAN package for a given MAC address
*
* @param byte mac[] - an array of 6 bytes representing the MAC address
**********************************************************************/
void WOL(byte mac[6]) {
 
  //the first 6 bytes of a WoL package are "0xFF"
  byte preamble[] = {
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF    };
  char i;

  //send a UDP package to the broadcast address of the actual configured network
  //to UDP port 7
  Udp.beginPacket(bc, 7);
 
  //send preamble
  Udp.write(preamble, sizeof preamble);

  //now send the MAC address 16 times as recommended by WoL protocol
  for (i=0; i<16; i++)
    Udp.write(mac, 6);

  //finally end the package and send out
  Udp.endPacket();



Die Funktion WOL bekommt einfach das Array mit der MAC-Adresse und schickt dann damit ein WoL Paket raus.

Mario.

Go Up