Hallo,
ich möchte mit meinem Arduino und dem Ethernet Shield einen PC über WOL
starten können.
Ich habe im Internet volgenden Code gefunden.
Warum funktioniert er nicht? PC wird nicht gestartet.
1
2
3
// Arduino Wake-On-LAN
4
// Needs Arduino > 1.0-beta3 with the new UDP API ( http://code.google.com/p/arduino/wiki/Arduino1 )
Den Code habe ich mir jetzt nicht angeschaut.
Zum einen muss Deine Ethernetkarte Wake-On-LAN unterstützen. Nicht alle
tun das.
Zum anderen kann es sein, dass das Feature erst an/in der Hardware oder
per Software (evtl. BIOS) aktiviert werden muss.
Das sizeof mac in der Funktion WOL liefert nicht den gewünschten Wert.
Da kommt sizeof (byte*) raus
Entweder du machst einen extra Paramter oder schreibst fest 6 rein.
Dirk B. schrieb:> Das sizeof mac in der Funktion WOL liefert nicht den gewünschten> Wert.> Da kommt sizeof (byte*) raus>> Entweder du machst einen extra Paramter oder schreibst fest 6 rein.
ok, jetzt nochmals bitte für dummies. Wo muss ich die 6 reinschreiben?
lens23 schrieb:> ok, jetzt nochmals bitte für dummies. Wo muss ich die 6 reinschreiben?
Udp.write(mac, 6);
Weil Du das Array als Zeiger an die Funktion übergibst, ist "sizeof mac"
nämlich nur 2 (= Größe des Zeigers).
lens23 schrieb:> byte pc_mac[] = {0x00, 0x24, 0x21, 0x7B, 0xA0, 0x07}; // PC's MAC> address
Die Adresse des 2. PC ebenfalls in ein Array schreien und dann aufrufen?
byte pc_mac_2[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05}; // 2. PC's MAC
WOL(pc_mac_2);
Tschuldigt, wenn ich hier so an diesen alten Therad anstückle, aber ich
bin gerade dabei, mich in die Ardiuno Programmierung zu stürzen. Ich
verstehe nicht, wieso die vorgeschlagene Lösung funktioniert.
definiert doch keinen Pointer, sondern ein statisches Array of Byte der
Größe 6. Deswegen müsste sizeof mac eigentlich 6 zurückgeben, so wie das
wohl auch die Absicht des Autors des ursprünglichen Codes war.
Um einen Pointer zu definieren, müsste ich doch in etwa sowas schreiben:
Ebenso bei der Übergabe an die WOL Funktion: ich sehe den Pointer nicht.
Kann jemand etwas genauer darlegen, wie der Pointer in den Code kommt,
soass sizeof auf 2 kommt statt auf 6? Dass es so ist nehme ich mal an,
denn sonst wäre das Problem keins gewesen. Ich kann aber beim besten
Willen der Erklärung nicht folgen.
Vielen Dank,
Armin.
ArminLinder schrieb:> Ebenso bei der Übergabe an die WOL Funktion: ich sehe den Pointer nicht.
Bei Funktionsparametern zerfällt das Array automatisch zu einem Pointer
auf den Anfang des Arrays. C Grundlagen.
ArminLinder schrieb:> Deswegen müsste sizeof mac eigentlich 6 zurückgeben,
Vollkommen Richtig.
Tut es auch.
(wenn man es nicht vorher durch die Parameter Mühle verfälscht)
Dirk B. schrieb:> Bei Funktionsparametern zerfällt das Array automatisch zu einem Pointer.> C Grundlagen.
Arduino spielt das Lied in C++
Man kann das also auch unterbinden. (Referenz übergeben oder/und als
Array Typisieren)
ArminLinder schrieb:> Ich kann aber beim besten> Willen der Erklärung nicht folgen.
C++ führt die Größe im Datentype mit
1
usingMyArrayType=byte[6];
2
3
MyArrayTypemacA{0x90,0xA2,0xDA,0x0D,0xB1,0xAC};
4
5
6
//--
7
8
bytemacB[]{0x90,0xA2,0xDA,0x0D,0xB1,0xAC};
1
sizeof(MyArrayType)// sagt 6
2
sizeof(macA)// sagt 6
3
sizeof(macB)// sagt 6
Eine klügere Definition der Funktion sollte wohl in etwa so aussehen:
Arduino Fanboy D. schrieb:> Arduino spielt das Lied in C++
Das sind Raw-Arrays wie in C.
Was du da schreibst ist nicht das Problem.
Schau dir die Zeile
Udp.write(mac, sizeof mac);
im Eröffnungspost an und sag, wieviel Byte da gesendet werden.
Arduino Fanboy D. schrieb:> Dirk B. schrieb:>> und sag> Nix sage ich dazu!> Ist alles gesagt!
Aber noch nicht von jedem. Merke dir: Die Oper ist erst zu Ende wenn die
dicke Dame gesungen hat.
John schrieb:> Arduino Fanboy eben. Große Klappe und nix dahinter.
Schwachmat!
Wenn du nicht kapierst, wie man das
Dirk B. schrieb:> zerfällt das Array automatisch zu einem Pointer
In C++ unterbindet, dann gute Nacht.