Ich benutze den U-Radig-Webserver mit einem Atmega 1284. Ziel ist im
Prinzip Übertragung von Steuerbefehlen, zur Zeit nur UDP. Folgendes
Problem ist aufgetreten:
Den ENC-Eingangsport habe ich per add_udp_app in die Anwendungsliste
eingetragen.
Ich schicke eine UDP-Sequenz mit IP/Eingangsport an den Atmega.
Die Funktion eth_get_data() wertet die einkommenden Daten aus. Die
Funktion
check_packet() leitet eingehende UDP-Daten an die Funktion
1 | //Diese Routine verwaltet die UDP Ports
|
2 | void udp_socket_process(void)
|
3 | {
|
4 | unsigned char port_index = 0;
|
5 | struct UDP_Header *udp;
|
6 |
|
7 | udp = (struct UDP_Header *)ð_buffer[UDP_OFFSET];
|
8 |
|
9 | //UDP DestPort mit Portanwendungsliste durchführen
|
10 | while (UDP_PORT_TABLE[port_index].port && UDP_PORT_TABLE[port_index].port!=(htons(udp->udp_DestPort)))
|
11 | {
|
12 | port_index++;
|
13 |
|
14 | DEBUG("\r\nport %1i.%1i\r\n",port_index, UDP_PORT_TABLE[port_index].port);
|
15 | DEBUG("\r\nhtons %1i.%1i\r\n",udp->udp_DestPort,htons(udp->udp_DestPort) );
|
16 |
|
17 |
|
18 | }
|
19 |
|
20 | // Wenn index zu gross, dann beenden keine vorhandene Anwendung für den Port
|
21 | if (!UDP_PORT_TABLE[port_index].port)
|
22 | {
|
23 | //Keine vorhandene Anwendung eingetragen! (ENDE)
|
24 | DEBUG("UDP Keine Anwendung gefunden!\r\n");
|
25 | return;
|
26 | }
|
27 |
|
28 | //zugehörige Anwendung ausführen
|
29 | UDP_PORT_TABLE[port_index].fp(0);
|
30 | return;
|
31 | }
|
weiter.
Wenn ich verschiedene Ports durchprobiere, werden die ports über die
Funktion htons() richtig angezeigt. Wenn ich aber den Port ansteuere,
der in der Anwendungstabelle gelistet ist, wandelt htons den Wert 6121
in 6120 um. Der Wert für den Port wurde offenbar vorher im Programm
geändert. Auf diese Weise wird die dem Port zugewiesene Anwendung nie
angesprochen.
Warum? Was mache ich falsch? Bin für jeden Hinweis dankbar.