Hallo Leute! Ich arbeite mit einen Atmega1280 und ENC28J60. Ich habe die Bibliothek von Iain Derrignton benutzt, aber es läuft nicht gut. Wenn ich ein ARP-Packet (42 Bytes) vom µC sende, dann übertragt dieser das Paket zwar, aber leider mit einen Trailer (80 ~ 1600 Byte Gesamtgröße), siehe Anhang. Wenn ich ein ARP-Paket an den µC über Ethernet sende, dann wird dieses Paket völlig falsch beim µC empfangen. Weiß ihr wo kann das Problem liegen? Vielen Dank.
Vielleicht ein Bufferoverflow. Ich würde im Sourcecode vor und nach jeden Puffer eine initialisierte, d.h. typische uint32_t Konstante setzen und aufpassen, ob die in dem Datagramm auftaucht. Das wäre dann der Hinweis, welcher Puffer überschiesst. Bsp:
1 | #define BUFFERDEBUG 1 // 0 = Aus
|
2 | |
3 | uint16_t MACWrite() |
4 | {
|
5 | |
6 | volatile uint16_t address = TXSTART; |
7 | uint8_t bytControl; |
8 | #if BUFFERDEBUG
|
9 | uint32_t pre_buffer_1 = 0x12345601; |
10 | #endif
|
11 | unsigned char uip_buf[] = {0x64, 0x31, 0x50, 0x71, 0xbb, 0xe5, 0x10, 0x12, 0xe2, 0x10, 0x10, 0xd0, 0x08, 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x02, 0x10, 0x12, 0xe2, 0x10, 0x10, 0xd0, 0xc0, 0xa8, 0x00, 0x02, 0x64, 0x31, 0x50, 0x71, 0xbb, 0xe5, 0xc0, 0xa8, 0x00, 0x01}; |
12 | #if BUFFERDEBUG
|
13 | uint32_t post_buffer_1 = 0x12345602; |
14 | #endif
|
15 | bytControl = 0x00; |
16 | ...
|
Bei dem Buffer uip_buf kann ein Problem auftauchen: In der Source wird der mit obiger Zeile definiert und mit folgender Zeile benutzt:
1 | address+=WriteMacBuffer(&uip_buf[0], UIP_LLH_LEN); |
Wenn UIP_LLH_LEN größer definiert ist als oben Elemente initialisiert werden, wird über die Arraygrenze hinaus zugegriffen. Ähnliche Stellen kommen noch weiter im Code vor z.B.
1 | if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) |
2 | {
|
3 | address+=WriteMacBuffer(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN); |
4 | }
|
5 | else
|
6 | {
|
7 | address+=WriteMacBuffer(&uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN); |
8 | address+=WriteMacBuffer(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN); |
9 | }
|
Mit uip_len habe ich an der Stelle Verständnisprobleme. Innerhalb MACWrite() an obiger Stelle ist das eine globale Variable. In dem von dir gezeigten Code ist weder die Definition zu sehen noch die Zuweisung, die letztlich einen Rückschluß auf den Inahlt an obiger Stelle erlaubt.
Vielen Dank von deine Antwort, ich werde jetzt der Bufferdebug probieren. Ich benutze auch den uIP TCP/IP stack von Adams Dunkel und uip_len ist in uip.c definiert.
Ich habe das Problem mit dem Senden gelöst. Die Ursache war, dass die Pointern falsch gesetzt waren. Jetzt muss ich herausfinden, warum das Empfangen von Packeten nicht funktioniert. Danke.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.