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
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
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
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
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?
> 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
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?
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.
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
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
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
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);
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
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
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
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:
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
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.