PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeiger(Pointer) verarbeiten bzw. umwandeln



gamebeast
30.01.2006, 18:51
Hallo,

ich bisher hier bisher noch nix gepostet da ich bisher alles mit der Suchfunktion oder google lösen konnte aber dieses mal nicht.

Problem:
ich habe ein Ethernut board und habe dort erfolgreich Uip 0.90 zum laufen bekommen. Selbst auf dem Port 1000 werden IP packete emfangen oder Gesendet. Und da ist auch schon das Problem.
Wenn ich daten von ein PHP Script sende kommen die Daten auch richtig an und werden auf dem Ethernut im ram gespeichert. und mit pointer uip_appdata zur verfügung gestellt.

wenn ich folgenden code drauf packe werden die Daten auf PORT 1000 gelauscht und gleich wieder zurück gesendet.

#include "app.h"
void serial_init(void)
{
uip_listen(HTONS(1000));
}
void serial_app(void)
{
if(uip_newdata() || uip_rexmit())
{

uip_send(uip_appdata,uip_len);

}
}
Ich möchte aber gerne die Daten von uip_appdata in einer IF oder switch anweisung behandeln. was aber egal wie nicht so richtig geklappt hat.

ich habe volgendes bereits probiert.


int data = *uip_appdata
if(*uip_appdata == "aufgabe1"){...
if(uip_appdata == "aufgabe1"){...
etc...

könntet Ihr mit bitte helfen? Ich bin für alles offen.

PS: Sorry wegen mein Deutsch aber ich bin nicht von hier.

Danke und schönen Abend noch

MfG
Gamebeast

PicNick
30.01.2006, 19:00
Es kommt etwas darauf an, wie uip_appdata definiert ist. Wenn das wirklich eine Adresse (Pointer) auf einen Input-String ist , also

char* uip_appdata;
dann vergleichst du:

if (strcmp(uip_appdata, "aufgabe1") == 0) // EQUAL
Wobei du aufpassen musst auf Groß- Kleinschreibung, das muß genau passen.

"strcmp()" ist irgendwo in den normalen includes dabei (string.h ?),
das merk ich mir nie.


EDIT: wenn der Input-String NICHT mit \0 abegeschlossen ist, mußt du

if (strncmp(uip_appdata, "aufgabe1", 8) == 0) // EQUAL
also mit Länge vergleichen

ogni42
30.01.2006, 19:05
Ergänzung: Besser ist strncmp(uip_appdata, "aufgabe1", uip_len), da dort nur so viele Zeichen verglichen werden, wie der Puffer maximal lang ist. Wenn "aufgabe1" länger sein sollte als der Puffer ist sonst das Ergebnis nicht vorhersagbar.

gamebeast
30.01.2006, 19:24
Danke hat super geklappt.

in der <string.h> zufinden ^^

if (strncmp(uip_appdata, "aufgabe1", uip_len) == 0){
uip_send("richtig",7);
}else{
uip_send("falsch",5);
}

Danke habt mir sehr geholfen

SprinterSB
31.01.2006, 15:06
Nein, wenn "aufgabe1" länger ist als der Puffer, ist das Ergebnis nicht undefiniert, sondern die Strings sind ungleich (ist nur ein Vergleich, kein strcpy!). Wenn das Stringende 0 fehlt muss natürlich strncmp genommen werden.

Wenn sich der String nicht ändert, kannst du ihn im Flash lassen und musst nicht SRAM und Flash belegen:


#include <avr/pgmspace.h>

if (0 == strncmp_P (uip_appdata, "aufgabe1", uip_len))
{
// mach was bei Gleichheit der ersten uip_len Zeichen
}

if (0 == strcmp_P (uip_appdata, "aufgabe1"))
{
// mach was bei Gleichheit
}

ogni42
31.01.2006, 15:32
Vorsicht, wenn uip_appdata nur 3 Zeichen lang ist und dort "auf" steht, hinter dem Puffer aber "gabe1\0" steht, sind die Strings in Deinem Fall gleich, obwohl eigentlich ungleich heraus kommen müsste. Ist zugegebenermassen ein pathologischer Fall, aber die Wahrscheinlichkeit ist != 0, insbesondere, wenn vorher strcpy statt strncpy verwendet wurde. An keiner Stelle ist gesagt, dass der Puffer einen 0-terminierten String enthält.