Forum: Mikrocontroller und Digitale Elektronik AVR Webserver Radig eingabe speichern


von geist (Gast)


Lesenswert?

Hallo ihr,

ich hoffe ihr könnt mir in dieser Speziellen Frage Helfen.

Ich habe auf meinem AVR NET-IO die Software vom Ulrich Radig laufen.
Das läuft auch super.
Allerdings wollte ich die Webseite jetzt so weit modifizieren, dass ich 
dort über ein Formular eingaben tätigen kann und diese dann in einem 
Array ablege.
Das Formular ist Fertig und läuft auch so weit.
Allerdings komme ich nichtganz damit zurecht wie ich diese Werte (die 
POST übertragen werden) beim Radig auslesen kann.
Er hat dort eigentlich ja ein Switch Anweisung in der Datei httpd.c 
womit er Abfragt ob der hacken bei A, B,... usw. gesetzt ist.
Dies muss ich jetzt umschreiben, dass ich die ganzen werte auslesen 
kann, nur wie?
Hat damit jemand schon einmal gespielt?

Gruß Geist

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

die Funktion vor der switch-Anweisung sucht nach dem Parameter "OUT=" 
und wertet den anschließend übergebenen Wert (A, B oder C) aus. Du 
könntest die Funktion verwenden und deinen Daten einfach einen anderen 
Buchstaben vorransetzten und dann sind die nächsten Bytes im 
eth_buffer deine übergebenen Daten. Wenn du hier allerdings längere 
Strings übergeben willst dürfte es ein Problem geben wenn innerhab eines 
solchen ein Paket zu Ende ist und der Rest im nächsten Paket kommt.

Sascha

von geist (Gast)


Lesenswert?

Danke für die schnelle Antwort,

aber denkst du das dass auch klappt?
Denn ich habe in dem Formular 5 Selekt Anweisung die einen maximale 
stringlänge von 13 Zeichen hat, hinzu kommen 6 Inputfelder mit je 2 bis 
3 Zeichenlängen.

Diese ganzen Daten sollen ausgelesen und in einem Array gespeichert 
werden.
Ich befürchte das diese dann nicht möglich ist oder?

geist

von Sascha W. (sascha-w)


Lesenswert?

das sollte schon noch möglich sein - von der Datenmenge. Allerdings ist 
die Frage ob du die statischen Werte aus den select/option-Tags als 
String übermitteln und speichern musst. Du könntest auch einfach nur 
eine Nummer übergeben die den gewählten Eintrag representiert.

Sascha

von geist (Gast)


Lesenswert?

Da hast du recht das wäre eine gute möglichkeit.
Da bleibt nur noch ein Problem.
Ich möchte in den Inputfeldern zahlen (Datum) eingeben aber wie kann ich 
das dann realisieren das dort ein A oder so voran geht um diesen String 
zu finden?

von Sascha W. (sascha-w)


Lesenswert?

> Da bleibt nur noch ein Problem.
> Ich möchte in den Inputfeldern zahlen (Datum) eingeben aber wie kann ich
> das dann realisieren das dort ein A oder so voran geht um diesen String
> zu finden?
Entweder mit JavaScript vor dem Absenden die Daten bearbeiten, oder den 
Stack im AVR so umschreiben, das die Datenfelder anhand ihres Namens 
auseinandergehalten werden können.

Sascha

von geist (Gast)


Lesenswert?

Hallo,
danke erst einmal für eure Antworten.

Ich habe es nur endlich hinbekommen werte zu übergeben und in Varibalen 
zu schreiben.
Allerdings bekomme ich immer nur von dem letzten input feld diese werte 
die anderen felder gibt mir eth_buffer leider nicht zurück.
worann kann das liegen oder ist das script jeweils immer nur für eine 
übertragung gedacht?

von Markus R. (maggus)


Angehängte Dateien:

Lesenswert?

Ich bastel auch gerade an einem Webserver auf basis des Codes von Ulrich 
Radig. Ich hab die httpd.c und die webpage.h etwas abgeändert, u.A. auch 
zur Übertragung von Test. Ich hänge die Files mal an, vll. hilfts dir ja 
etwas weiter.

von Sascha W. (sascha-w)


Lesenswert?

du kannst eigentlichen mehrere Werte übergeben und auswerten (wird ja 
auch schon gemacht, Wert und dieses "SUB="), nur die müssen natürlich 
unterschiedliche Namen haben.

Sascha

von geist (Gast)


Lesenswert?

Danke, das hat mich einiges weiter gebracht.

von geist (Gast)


Lesenswert?

Hi,

habe schon wieder ein kleines Problem.
Und zwar nutze ich eine for schleife die Werte auf der Homepage aus zu 
geben.
Allerdings bringt er mir maximal zwei mal das ganze und dann hängt der 
Atmel sich auf.
Ich habe auch schon ein neue Variable mit mehr Zeichen angelegt nur wenn 
ich diese auf die Größe von z.B. 1024 Zeichen setze baut er schon gar 
nicht mehr die Seite auf.
Den Text den er ausgeben soll ist:
1
sprintf_P(data, PSTR(" <div class=\"eingabe\">%i FREI: %i Raum:%i Ein am:%i.%i.%i um %i:%iUhr AUS:%i.%i.%i um %i:%iUhr</div> "),i,Time_Speicher[i].Frei, Time_Speicher[i].Raum, Time_Speicher[i].EIN_Day,Time_Speicher[i].EIN_Month,Time_Speicher[i].EIN_Year,Time_Speicher[i].EIN_Hour,Time_Speicher[i].EIN_Min,Time_Speicher[i].AUS_Day,Time_Speicher[i].AUS_Month,Time_Speicher[i].AUS_Year,Time_Speicher[i].AUS_Hour,Time_Speicher[i].AUS_Min);
Wobei die Arrays die Speicher sind wo ich die Werte eingespeichert habe.
Ich denke das es zu viel Speicher dafür benötigen würde oder woran kann 
es liegen?

Gruß Geist

von Karl H. (kbuchegg)


Lesenswert?

geist schrieb:

> Ich habe auch schon ein neue Variable mit mehr Zeichen angelegt

gut

> nur wenn
> ich diese auf die Größe von z.B. 1024 Zeichen setze baut er schon gar
> nicht mehr die Seite auf.

1024? Du gehst aber gleich aufs Ganze.
Der Mega32 am Net-IO hat nur 2kByte!

Wie gross ist denn deine SRAM Auslastung?


(1024 brauchst du doch gar nicht. Mach doch erst mal eine einigermassen 
relaistische Schätzung. Wieviele Zeichen werden bei
1
<div class=\"eingabe\">%i FREI: %i Raum:%i Ein am:%i.%i.%i um %i:%iUhr AUS:%i.%i.%i um %i:%iUhr</div>

nach Ersetzung der Werte so rauskommen. Da gibst du dann noch 20 oder 30 
zur Reserve mit dazu und gut ists. Indem du von einem Extrem ins andere 
springst, löst du keine Probleme)


> Den Text den er ausgeben soll ist:

PS: Man kann Code auch umbrechen und muss nicht alles in einer Zeile 
reinknüdeln
1
   sprintf_P( data, PSTR(" <div class=\"eingabe\">%i "
2
                           "FREI: %i "
3
                           "Raum:%i "
4
                           "Ein am:%i.%i.%i um %i:%iUhr "
5
                           "AUS:%i.%i.%i um %i:%iUhr"
6
                         "</div>"),
7
8
                          i,
9
                          Time_Speicher[i].Frei,
10
                          Time_Speicher[i].Raum,
11
                          Time_Speicher[i].EIN_Day, Time_Speicher[i].EIN_Month, Time_Speicher[i].EIN_Year,
12
                          Time_Speicher[i].EIN_Hour, Time_Speicher[i].EIN_Min,
13
                          Time_Speicher[i].AUS_Day, Time_Speicher[i].AUS_Month, Time_Speicher[i].AUS_Year,
14
                          Time_Speicher[i].AUS_Hour, Time_Speicher[i].AUS_Min
15
             );

von geist (Gast)


Lesenswert?

Danke,

das man Code auch umbrechen kann wusste ich auch, habe es nur für 
testzwecke noch nicht machen wollen.

An sich sind es auf den ersten Blick nicht viele Zeichen. jedes %i wird 
mit maximal zwei zahlen ersetzt.
Allerdings wenn ich dann diese schleife durchlaufen lasse bekomme ich 
bis zu 40 oder 50 solcher Ausgaben und diese muss ich ja irgendwie in 
eine variable schieben.
Und das ist mein Problem.
Hier vieleicht zur Verdeutlichung die schleife
1
for(i=0;i<speicher_groesse;i++)
2
        {
3
          /*if(  Time_Speicher[i].Frei == NEIN)
4
          {*/
5
            sprintf_P(data, PSTR(" <div class=\"eingabe\">%i FREI: %i Raum:%i Ein am:%i.%i.%i um %i:%iUhr AUS:%i.%i.%i um %i:%iUhr</div> "),i,Time_Speicher[i].Frei, Time_Speicher[i].Raum, Time_Speicher[i].EIN_Day,Time_Speicher[i].EIN_Month,Time_Speicher[i].EIN_Year,Time_Speicher[i].EIN_Hour,Time_Speicher[i].EIN_Min,Time_Speicher[i].AUS_Day,Time_Speicher[i].AUS_Month,Time_Speicher[i].AUS_Year,Time_Speicher[i].AUS_Hour,Time_Speicher[i].AUS_Min);
6
          //}
7
          
8
        
9
        }
10
        str_len = strnlen(data,256);
11
        memmove(&eth_buffer[TCP_DATA_START+a],data,str_len);
12
        a += str_len-1;
13
        http_entry[index].new_page_pointer = http_entry[index].new_page_pointer+5;
es kann natürlich auch ein ganz banaler Fehler bei mir sein den ich 
jetzt mal wieder nicht finde.
Gruß Geist

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

du solltest bedenken, das bei deiner Ausgabegröße (ich hab in etwa 
100Byte gezählt * 40 = 4kB) das ganze weder in den Speicher des ATMega, 
noch in einen Ethernetframe passen wird!
Da musst du dir was einfallen lassen und die Ausgaben auf mehrere Frames 
aufteilen.

Sascha

von geist (Gast)


Lesenswert?

Hi,

nur wie soll ich das machen?
Hast du eine idee?

von Sascha W. (sascha-w)


Lesenswert?

nun ja, der Stack ist ja in der Lage die Daten auf mehrere Pakete 
aufzuteilen.
Innerhalb der Schleife
1
 for (a = 0;a<(MTU_SIZE-(TCP_DATA_START)-150);a++)
werden die Daten in den Ethernetbuffer kopiert.
Du must deine Schleife so anpassen, das das hinzufügen der Daten aus 
einem!! Schleifendurchlauf und die Berechnung der Paketgröße
1
        a += str_len-1;
noch innenhalb deiner Schleife durchgeführt werden. Sollte die 
Obergrenze erreicht sein a>(MTU_SIZE-(TCP_DATA_START)-150), dann musst 
du deine Schleife abbrechen und deinen erreicheten Schleifenwert in 
einem zusätzlichen Eintrag im TCP-Stack speichern. Beim nächsten Paket 
startet dann deine Schleife mit dem gespeicherten Wert +1.

Sascha

von geist (Gast)


Angehängte Dateien:

Lesenswert?

Hi Sascha,

ich verstehe zwar was du meinst, aber leider nicht wie ich das umsetzen 
soll.
Ich glaube dafür habe ich zu wenig ahnung von dem Stack und wie es 
verarbeitet wirt.

Ich habe schon einiges ausprobiert aber ent weder wird das Formular 
nicht mehr gescheit angezeigt oder nur die letzte Variable 10 mal 
ausgegeben.

Ich packe die ganze httpd.c datei mal in den anhang vieleicht kannst du 
mir  an hand der datei das erklären.

Gruß Geist

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

hab mir das jetzt noch mal angeschaut, aber das Problem lässt sich 
innerhalb der httpd.c nicht sinvoll lösen - spätestens bei einer 
Retransmision gibts ein Problem. Die Ausgabefunktion ist einfach nicht 
dafür gemacht eine unmenge Daten dynamisch zu generieren. Die bisher 
eingebauten Ersetzungsfunktionen erzeugen ja in der Ausgabe nur Daten 
die nicht, oder nur unwesentlich länger sind als der Platzhalter 
(%xx..). Für deine Anwendung währe es daher sinvoll folgenden Weg zu 
gehen.

Die Zeile <div class ... ist innerhalb deiner Website gespeichert, und 
nur die Daten werden live ersetzt.
Beispiel:
1
<div class="eingabe">%DataSSII Frei: %DataSSII Raum: %DataSSII ...
aus dem Platzhalter %DataSSII liest du dann wie bei %VA@xx die zwei 
Werte SS für die Indexnummer deinen Datenfelds Time_Speicher und II den 
entspechenden Wert aus dem Struct 00->.Frei, 01->.Raum u.s.w.

Das einzigste Problem hierbei ist, das die Anzahl der Elemente (bei dir 
Speichergröße) fest ist, denn die wird ja durch die Anzahl der in der 
Website eingebauten div-Elemente vorgegeben.
Wenn die unbedingt variabel sein muss, könnte man es evl. mit einiger 
Bastelarbeit realisieren die div-Elemente erst im Browser mittels 
Javascript dynamisch zu erzeugen (kein Problem). Das würde dann das 
nachladen der eigentlichen Struct-Daten mittels Script erfordern, da 
aber für den Abruf auch Daten an den Webserver übergeben werden müssten 
weiß ich jetzt nicht genau ob das mit POST als Übergabemethode machbar 
ist.

Sascha

von geist (Gast)


Lesenswert?

Danke,

Sascha Weber schrieb:
> Die Zeile <div class ... ist innerhalb deiner Website gespeichert, und
> nur die Daten werden live ersetzt.

dass könnte ich machen ist zwar nicht die optisch schönste lösung aber 
ich denke das ist erst ein mal egal.

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
Noch kein Account? Hier anmelden.