Forum: Mikrocontroller und Digitale Elektronik AVR Daten aus SRAM in HTML Code einfügen


von Thomas W. (tom_2)


Lesenswert?

Hallo zusammen.
Arbeite schon lange mit Assembler und habe jetzt ein Problem zu lösen, 
wo mir leider keine Lösung einfällt. Deshalb frage ich hier mal, wie ihr 
solche Dinge löst?
Habe eine Webseite im ATmega 640 die ich mit folgendem Programmcode über 
UART und einem WIZNET TCP/IP Modul über das Netzwerk bei Anfrage sende.

Webseite_senden:
ldi ZL, LOW(2*webseite)
ldi ZH, HIGH(2*webseite)
html_text_senden:
lpm   temp, Z+
cpi   temp, 0
breq  html_text_ende
call UART_0_senden
rjmp  html_text_senden
html_text_ende:
ret

webseite:
.db "<html><body>......usw. ...</Body></html>",0
;Null dient als Endeerkennung

Also einen ganz normalen Assembler Code um Daten die unter .db abgelegt 
sind über die UART zu übertragen. Jetzt ist es ja so, das die Webseite 
nicht nur konstante Daten beinhaltet, sondern sich spezielle Werte in 
der Webseite ändern, die man schließlich darstellen möchte. Das beste 
wäre natürlich wenn man das .db so gestalten könnte:

Webseite:
.db ""<html><body><p>ANALOGWERT 1 = 
",zahl1,zahl2,zahl3,"</p><p>ANALOGWERT 2 = ",zahl1,zahl2,zahl3,"</p>... 
usw. ...</Body></html>",0

zahl1, zahl2, zahl3 wären jeweils eine SRAM Variable die den 
darzustellenden ASCII Wert (in diesem Falle nur 3-stellig) beinhalten 
würde. Also z.B. soll die 214 eingefügt und dargestellt werden und in 
der SRAM Variable zahl1 wäre die 2 als ASCII Wert in zahl2 wäre die 1 
als ASCII Wert und in zahl3 wäre die 4 als ASCII Wert.
LEIDER! geht das aber so nicht zu machen, das man SRAM Variablen in .db 
oder auch .dw so einfach einbauen kann. In der Vergangheit habe ich es 
so gelöst, das ich immer an der Stelle, wo ein Wert eingetragen wurde, 
den HTML Programmcode unterbrochen habe, den Wert als ASCII mit einem 
anderen Unterprogramm übertragen habe und danach den HTML Code wieder 
weiter abgearbeitet habe.
Das funktioniert zwar, ist aber sehr umfangreich und sehr 
unübersichtlich, da jedes mal ein Teil des HTML Codes wieder mit ldi ZH, 
ldi ZL, LPM usw. aufgerufen werden muß, was letztendlich eine Menge an 
HTML Schnipselcode ergibt und man schnell die Übersicht verliert.
Wie macht ihr das denn in Assembler, wenn ihr in einen HTML Code oder 
anderes, dynamische Werte z.B. aus dem SRAM einbringen bzw. dazwischen 
schieben wollt? Danke für eure Hilfe. Gruß Tom

von Heiko G. (heikog)


Lesenswert?

Na ja, für sowas nimmt man eigentlich was anderes als Assembler.

Eine Möglichkeit das relativ einfach zu realisieren ist es, ein 
beliebiges Zeichen, das sonst nicht im Text vorkommt, pro auszugebender 
Zahl in den HTML-Text zu schreiben, und dann im Programm vor dem 'call 
UART_0_senden' auf dieses Zeichen zu testen und gegebenfalls eine 
Wert-Ausgaberoutine anstelle des 'call UART_0_senden' aufzurufen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Thomas W. schrieb:
> Wie macht ihr das denn in Assembler, wenn ihr in einen HTML Code ...

Du könntest Dich nach einer Library mit Stringverarbeitungsfunktionen 
umsehen und diese verwenden.

Ansonsten wird es vielleicht auch Gründe dafür geben, warum das Erzeugen 
von mehr oder weniger aufwendigen Texten nicht allgemein etwas ist, was 
in Assembler programmiert wird.

von Thomas W. (tom_2)


Lesenswert?

Die Idee von Heiko hat mich auf eine Lösung gebracht, die ich mal so 
ausprobieren werde.
Den HTML Text ganz normal mit dem Registerpaar Z und dem LPM Befehl 
laden und senden und immer an der Stelle wo eine ASCII Zahl bzw. Wert 
eingefügt werden muß ein Zeichen z.B. 0x01 sollte in HTML als ASCII 
Zeichen soweit ich weis nicht vorkommen, einfügen.
Die einzuschiebenden Werte vorab in richtiger Reichenfolge in das SRAM 
ablegen und dann mit dem Registerpaar Y immer ein Datenbyte aus dem SRAM 
holen und den Wert des Registerpaares Y inkrementieren, wenn die 0x01 
auftritt. Somit hätte ich sogar mit dem 0x01 einen Platzhalter und die 
Content Lenght, welche ich für HTTP Benötige würde auch einfach zu 
bestimmen sein. Danke Heiko für deine tolle Idee.

von Thomas W. (tom_2)


Lesenswert?

Ich denke eine Library mit Stringverarbeitungsfunktionen wird es nur für 
C geben. Diese kann ich mir mal gerne ansehen, um zu verstehen wie man 
das einfügen von SRAM- Werten macht. Eventuell finde ich da auch noch 
eine andere Idee wie man so etwas lösen kann.

Auch wie Heiko schon verlauten lies, C wäre besser, aber ich sage 
immer...
Wenn der Compiler von C einen Programmcode erzeugen kann, den der ATmega 
versteht und auch das macht was er soll, dann muß es auch in Assembler 
möglich sein. Denn das Ausgangsprodukt (HEX File), was letztendlich in 
den Flash des ATmega geschrieben wird ist im Grunde genommen das selbe. 
Es kommt halt in Assembler nur darauf an zu wissen wie man auf ein 
ähnliches Ergebnis kommt wie es aus dem C-Compiler gespuckt wird. Das 
ist leider manchmal sehr mühsam, das gebe ich gerne zu. Ist aber auf 
anderer Seite auch eine Herausforderung, die man gerne bewältigen 
möchte.
Danke für eure Hilfe, das bringt mich doch schon viel, viel weiter. :-)

von Thomas W. (tom_2)


Angehängte Dateien:

Lesenswert?

Hallo Heiko.
Habe gerade mal das so ausprobiert wie ich es beschrieben hatte. So mit 
den beiden Registerpaaren Z und Y. Funktioniert hervorragend!!! Nochmals 
besten Dank für deinen Vorschlag.
Damit auch andere Assembler Freunde eine Webseite aus dem ATmega heraus 
"basteln" können, habe ich den Grundsätzlichen Code mal als PDF Datei 
angehangen. Danke nochmals für deine Idee.

von Jobst M. (jobstens-de)


Lesenswert?

Man kann sogar Variablen in die Seite einbauen, so dass man sich im 
Assemblercode gar nicht mehr darum kümmern muss, welche Zahl ausgegeben 
werden soll:
1
.db  "<html><body> Dies ist Aufruf ",1,Aufrufe," dieser Seite</body></html>",0

1 ist die Einleitung, dass nun eine Adresse im RAM folgt, ab der ein 
Text liegt.
Bei 0 endet der String.

Ausgabe aus ROM mit Z, Ausgabe aus RAM mit Y - wie schon von Dir 
gemacht.

Weitere Möglichkeiten wären:
2 - Zahl als Byte im RAM (0-255)
3 - Zahl als signed Byte im RAM (-128 - +127)
4 - Zahl als Word im RAM (0-65535)
5 - Zahl als signed Word im RAM (-32768 - +32767)
6 - Float

Gruß
Jobst

von Thomas W. (tom_2)


Lesenswert?

Hallo Jobst.
Dein Vorschlag würde die ganze Sache natürlich noch gestalterisch 
einfacher machen. Allerdings muß ich zugeben das ich es noch nicht ganz 
verstanden habe und möchte deshalb nochmal nachfragen.
Wenn ich unter .db wie dein Beispiel folgendes habe:

.db  "<html><body> Dies ist Aufruf ",1,Aufrufe," dieser 
Seite</body></html>",0

dann ist es klar, das die "1" die Erkennung dafür ist, das jetzt ein 
Byte aus dem SRAM folgt.
Aber was ich noch nicht richtig verstehe ist der Eintrag 
"...,Aufrufe,...". Aufrufe würde doch der Name bzw. die Adresse einer 
Variable sein, die die Anzahl der Aufrufe gespeichert hätte und die 
unter .dseg im SRAM definiert wurde? Oder sehe ich das falsch?
Soll das ganze dann vielleicht so ablaufen:?
"1" wird erkannt, das bedeutet die nächsten 2 einzulesenden Bytes sind 
kein String, sondern eine 16 Bit Adresse der Variable die das 
entsprechende anzuzeigende Byte enthält. Also wird der mit Z eingelesene 
Wert nicht als ASCII Wert über die UART gesendet, sondern das 1-er 
Erkennungsprogramm nimmt diesen Adresswert, liest aus dem SRAM den Wert 
aus und gibt diesen über die UART aus. Danach geht es ganz normal im 
String weiter.... Hast du es so gemeint? Habe ich das so richtig 
verstanden? Wenn ja, dann gibt es aber ein kleines Problem. Denn es 
werden ja immer 2 Bytes aus dem String gelsen und man müßte 
sicherstellen das nicht die "1" und das HIGH-Byte der Adresse sondern 
immer das HIGH-Byte und das LOW-Byte der Adresse zusammen gelesen 
werden. Danke für deine Hilfe. Gruß Tom

von Sascha W. (sascha-w)


Lesenswert?

Thomas W. schrieb:
> Hallo Jobst.
> Dein Vorschlag würde die ganze Sache natürlich noch gestalterisch
> einfacher machen. Allerdings muß ich zugeben das ich es noch nicht ganz
> verstanden habe und möchte deshalb nochmal nachfragen.
> Wenn ich unter .db wie dein Beispiel folgendes habe:
>
> .db  "<html><body> Dies ist Aufruf ",1,Aufrufe," dieser
> Seite</body></html>",0
>
> dann ist es klar, das die "1" die Erkennung dafür ist, das jetzt ein
> Byte aus dem SRAM folgt.
> Aber was ich noch nicht richtig verstehe ist der Eintrag
> "...,Aufrufe,...". Aufrufe würde doch der Name bzw. die Adresse einer
> Variable sein, die die Anzahl der Aufrufe gespeichert hätte und die
> unter .dseg im SRAM definiert wurde? Oder sehe ich das falsch?
> Soll das ganze dann vielleicht so ablaufen:?
> "1" wird erkannt, das bedeutet die nächsten 2 einzulesenden Bytes sind
> kein String, sondern eine 16 Bit Adresse der Variable die das
> entsprechende anzuzeigende Byte enthält. Also wird der mit Z eingelesene
> Wert nicht als ASCII Wert über die UART gesendet, sondern das 1-er
> Erkennungsprogramm nimmt diesen Adresswert, liest aus dem SRAM den Wert
> aus und gibt diesen über die UART aus. Danach geht es ganz normal im
> String weiter.... Hast du es so gemeint? Habe ich das so richtig
> verstanden?
genau so hat er es gemeint, hab ich auch schon auf diese Weise gmacht

> Wenn ja, dann gibt es aber ein kleines Problem. Denn es
> werden ja immer 2 Bytes aus dem String gelsen
Wieso? Es wird immer ein Byte gelesen.
> und man müßte
> sicherstellen das nicht die "1" und das HIGH-Byte der Adresse sondern
> immer das HIGH-Byte und das LOW-Byte der Adresse zusammen gelesen
> werden.
die ausgelesene "1" oder nennen wir es mal Token, verwirfst du und liest 
noch zwei Byte nach z.B. YL & YH. Eine Vorabbestimmung der Contentlength 
geht natürlich nur indem du ein Blinddurchlauf ohne Ausgabe machst. 
Gerade bei Dezimalausgabe von Werten hast du ja nie fixe Längen.

Sascha

von Jobst M. (jobstens-de)


Lesenswert?

Thomas W. schrieb:
> Hast du es so gemeint? Habe ich das so richtig
> verstanden?

Jopp

> Wenn ja, dann gibt es aber ein kleines Problem. Denn es
> werden ja immer 2 Bytes aus dem String gelsen und man müßte
> sicherstellen das nicht die "1" und das HIGH-Byte der Adresse sondern
> immer das HIGH-Byte und das LOW-Byte der Adresse zusammen gelesen
> werden.

Nein, es wird immer nur ein Byte gelesen (LPM kann nur Bytes). Ein 
anderes Problem könnte aber bei der Assemblierung entstehen, da die 
Adresse ein Wort ist und so nicht mit .db verarbeitet werden könnte. 
Dann muss man sich mit
..., 1, high(Aufrufe), low(Aufrufe), ...
behelfen.


Dann ergibt sich folgender Ablauf:
1
(Z ist mit Startadresse vom String gesetzt)
2
3
ROMloop:
4
LPM tmp, Z+
5
wenn tmp = 0 dann ret
6
wenn tmp = 1 dann jmp RAMausgabe
7
tmp ausgeben
8
jmp ROMloop
9
10
RAMausgabe:
11
LPM YH, Z+
12
LPM YL, Z+
13
RAMloop:
14
LPM tmp, Y+
15
wenn tmp = 0 dann jmp ROMloop
16
tmp ausgeben
17
jmp RAMloop


Gruß
Jobst

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Thomas W. schrieb:
> Damit auch andere Assembler Freunde eine Webseite aus dem ATmega heraus
> "basteln" können, habe ich den Grundsätzlichen Code mal als PDF Datei
> angehangen.

Ist das Ironie? Sicher, es gibt noch ungeeignetere Dateiformate dafür 
(JPG oder andere Bildformate), aber was spricht gegen eine stinknormale 
Textdatei?

von Heinz V. (heinz_v)


Angehängte Dateien:

Lesenswert?

Rufus Τ. F. schrieb:
> Ist das Ironie? Sicher, es gibt noch ungeeignetere Dateiformate dafür
> (JPG oder andere Bildformate), aber was spricht gegen eine stinknormale
> Textdatei?

Ich hab das mal gewandelt...

von nicht"Gast" (Gast)


Lesenswert?

Moin,

sry wenn ich mit einer blöden Frage dazwischen grätsche. Warum macht man 
so was eigentlich? Also, eine Webseite über seriell ausgeben.
Sinnvoller wäre es doch die Daten in einem einfachen Protokoll 
auszugeben und die Visualisierung den Rechner machen zu lassen.
Entweder bettet der das dann in eine Webseite ein oder du benutzt so was 
wie das ComVisu (Forumssuche)


Da stellt sich mir eine Frage. Kann man unter Linux den Browser direkt 
vom device file lesen lassen? also so was wie "file:///dev/ttyUSB0

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

nicht"Gast" schrieb:
> Warum macht man so was eigentlich? Also, eine Webseite über seriell
> ausgeben.

Du hast den Anfangsbeitrag wohl nur flüchtig gelesen:

> Habe eine Webseite im ATmega 640 die ich mit folgendem
> Programmcode über UART und einem WIZNET TCP/IP Modul
> über das Netzwerk bei Anfrage sende.

Die UART ist nur für die Kommunikation zwischen AVR und Netzwerkmodul 
nötig.

von nicht"Gast" (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Du hast den Anfangsbeitrag wohl nur flüchtig gelesen:

Lustig. Wird Zeit für ein Bier. Die Zeile mit dem Wiznet hab ich 
tatsächlich gelesen, aber das Wissen darüber hat sich beim Lesen der 
restlichen Beiträge wieder verflüchtigt :)

Mein Fehler

von Thomas W. (tom_2)


Lesenswert?

Hallo Jobst und Sascha.
Erst mal einen ganz großen Dank an Jobst für seine Idee der Umsetzung 
und vor allem für den tollen Beispielcode.
Obwohl ich schon seit vielen Jahren programmiere, habe ich noch nie eine 
Adresse in .db gebracht bzw. von dort ausgelesen. Das sogar 
HIGH(Adressbyte) und LOW(Adressbyte) unter .db überhaupt geht, wusste 
ich bis heute noch nicht. Ist aber logisch, denn ldi r16, HIGH(wert) und 
ldi r17, LOW(wert) verwende ich ja schon immer... Auch das es möglich 
ist das Doppelregister Y mit LPM laden zu können hatte ich bis heute 
noch niemals benötigt. Also danke nochmals an Jobst für die tolle 
Unterstützung.

Wie Sascha auch schon geschrieben hatte, kann es eigentlich kein Problem 
mit den beiden Adresswerten geben. Es werden zwar immer 2 Byte 
"eingelesen" bzw. in den Prozess aufgenommen aber mit dem Befehl LPM 
jeweils nur ein Byte übergeben. Habe das ganze schon mal ausprobiert und 
es funktioniert auch nur mit ...",Aufrufe,"...

Letztendlich habe ich aber doch die erste Idee wie im geposteten 
Beispielcode verwendet. Nur aus dem Grund heraus, das die Anzahl der 
Bytes für die Content Lenght dann die gleiche ist, da für all die "1"-er 
dann auch nur ein Byte eingefügt wird. Wenn ich die "1" verwerfen müßte, 
wäre der Code für die Bestimmung der Content Lenght wesentlich 
aufwendiger!

von Thomas W. (tom_2)


Lesenswert?

Hallo Rufus Τ. Firefly.
Tut mir leid, mit dem PDF Format. Aber ich dachte es liest sich halt 
besser wenn die Farben mit drin sind.
Danke an Heinz für die Wandlung. Ok beim nächsten mal dann also TXT, 
versprochen.

Für alle die WIZNET nicht kennen sollten, das ist eine Koreanische Firma 
die verschiedene Module herstellt, die die Kommunikation über TCP/IP 
vollkommen autark machen und am Ausgang (kann SPI, UART, RS232 oder 
parallel sein) kommt dann nur noch HTTP und HTML raus. Das ist für einen 
Mikrocontroller das beste, wenn der sich nicht um die Protokolle TCP und 
IP kümmern muß. Die Einstellungen (IP Nummer, Baudrate usw.) können über 
das Netzwerk, oder über die Schnittstelle gemacht werden. Solch ein 
Modul kostet auch nicht die Welt... Habe schon mehrere Projekte mit 
solch einem Modul (WIZ107SR) ausgerüstet und bis heute kein Problem 
damit gehabt. Kann ich nur empfehlen.

von Jobst M. (jobstens-de)


Lesenswert?

Thomas W. schrieb:
> Obwohl ich schon seit vielen Jahren programmiere, habe ich noch nie eine
> Adresse in .db gebracht bzw. von dort ausgelesen.

Damit kann man sehr komplex verschachtelte/verknüpfte Daten ablegen! :-)

Oder springen ...
Beitrag "Re: Superprofi hat ein ASM Problem"


Gruß
Jobst

: Bearbeitet durch User
von Thomas W. (tom_2)


Lesenswert?

Hallo Jobst.
Du scheinst dich wirklich richtig professionell auszukennen. Ich ziehe 
den Hut. So etwas ähnliches mit der Verschachtelung oder Springen habe 
ich vor kurzem erst in einem Buch von Schwabel Schmidt gelesen. Hatte es 
zu diesem Zeitpunkt noch gar nicht verstanden wie er das meint. Aber 
jetzt kommt so allmählich Licht in das Dunkel...
Gestern Abend habe ich den Code für den Mikrocontroller noch fertig 
programmiert und ausprobiert. Funktioniert mit der kompletten Webseite 
hervorragend! Nur ein kleines Problem tauchte auf, welches ich euch noch 
mitteilen möchte, da es eventuell dem ein oder anderen helfen könnte.
Problem:
Zur Erstellung des HTML Codes habe ich natürlich einen HTML Editor 
verwendet, der eine Vorschaufunktion hat, um auch zu sehen welchen 
"Blödsinn" man verzapft hat. Im Editor lief alles ohne Probleme. Aber 
die Webseite im Mikrocontroller wurde zwar im Browser (IE) angezeigt und 
auch das Favicon (318 Bytes) wurde angezeigt, aber das eingefügte kleine 
JPG LOGO-Bild (2965 Bytes) nicht. Vom Browser kam noch nicht einmal die 
HTTP Anfrage "GET /bild.jpg...". Woran lag es? Es lag eigentlich am 
Browser, der immer alles schnell, schnell haben möchte....!
Grund:
Der Textbasierte Teil der Webseite ist 6510 Bytes groß darin enthalten 
sind dann 178 Bytes die "eingeschoben" werden. Die Übertragung des 
Bildes mit <img scr="bild.jpg"... passiert ziemlich am Anfang. Die 
Datenübertragung von der UART zum WIZNET Modul war auf 57600 Baud 
eingestellt. Dadurch hat es halt ca. 2 bis 3 Sekunden gedauert, bis der 
Textbasierte Teil der Webseite zum Browser übertragen war. Aber da war 
die Zeit zu lang und der Browser hat dann auf das Bild nicht mehr 
gewartet und die Anfrage "GET /bild.jpg... nicht mehr gesendet.
Lösung:
Habe einfach die Baudrate auf 115200 gesetzt und jetzt ist es auch 
schnell genug für den Browser, so das der die Anfrage für das Bild nicht 
verwirft. Jetzt wird auch das kleine LOGO-Bild angezeigt.

von S. R. (svenska)


Lesenswert?

Thomas W. schrieb:
> Dadurch hat es halt ca. 2 bis 3 Sekunden gedauert, bis der
> Textbasierte Teil der Webseite zum Browser übertragen war. Aber da war
> die Zeit zu lang und der Browser hat dann auf das Bild nicht mehr
> gewartet und die Anfrage "GET /bild.jpg... nicht mehr gesendet.

Das klingt ... äußerst unwahrscheinlich.

Ich vermute, dass der Browser das GET schon abgeschickt hat, als du noch 
mit dem Senden des Textes beschäftigt warst, und du hast deswegen davon 
nichts mitgekriegt (HTTP-Pipelining). Sowohl TCP als auch UART können 
fullduplex, aber du musst eben auch zuhören.

Theoretisch kannst du beliebig langsam senden. Wenn alle 2 Sekunden ein 
Zeichen reinkommt, bekommst du normalerweise keinen Timeout vom Browser. 
Ein Proxy in der Leitung mag das anders sehen.

von Marco H. (damarco)


Lesenswert?

Hähh das sollte sich kaum auswirken das HTTP tcp basiert und jeder Teil 
vom Browser geladen wird. Das einzige was sein kann das der Timeout 
zuschlägt da es zu lange dauert bis der Tx Buffer voll ist und das 
Pakete gesendet wird.

Das mit den Inhalten kann man auch mit CGI lösen was die dynamischen 
Inhalte nach lädt.  So muss ja die ganze Seite neu angefordert werden.

von Marco H. (damarco)


Lesenswert?

Naja der Browser versucht weitere Tcp Verbindung zu öffnen und wenn nur 
1 http Port offen ist wird die Verbindung abgewiesen.  Drück mal F12 für 
die debug Console des Browsers.

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Marco H. schrieb:
> Das einzige was sein kann das der Timeout zuschlägt da es zu lange
> dauert bis der Tx Buffer voll ist und das Pakete gesendet wird.

Es kann auch sein, dass der Browser HTTP-Pipelining betreibt, also "GET 
/\r\nGET /bild.jpg\r\n" mit zu kurzer Pause zwischen den Anfragen sendet 
und erwartet, dass beide beantwortet werden.

Während ein Request bearbeitet wird, dürfen weiterhin reinkommende 
Requests nicht verworfen werden (Ausnahme: HTTP/1.0 oder 
close-after-request).

von Thomas W. (tom_2)


Lesenswert?

S. R. schrieb:
> Ich vermute, dass der Browser das GET schon abgeschickt hat, als du noch
> mit dem Senden des Textes beschäftigt warst, und du hast deswegen davon
> nichts mitgekriegt (HTTP-Pipelining). Sowohl TCP als auch UART können
> fullduplex, aber du musst eben auch zuhören.

Das die Netzwerkleitung Duplex ist, weis ich. Aber ich war immer der 
Meinung, das der Browser doch erst einmal warten müsste bis die mit "GET 
/ usw. angeforderte Startseite auch wirklich bis zum letzten Byte beim 
Browser angekommen ist. Hatte auch an der RX Leitung der Verbindung vom 
WIZNET Modul zum ATmega eine "Mithörleitung" zu einem Terminal Programm 
angeschlossen. Während des Sendens der Webseite zum Browser kam da 
nichts an. Erst als die Webseite vollständig übertragen war, kam die 
Anfrage zum Favicon, aber niemals die Anfrage zum Bild. Vielleicht muss 
ich eventuell mal meine Einstellungen im WIZNET Modul überprüfen. 
Eventuell lässt das ein Duplex nicht zu, oder Duplex ist abgeschaltet 
oder sowas...

Naja, irgendwie bekommt man es doch immer wieder hin... :-) Hauptsache 
es funktioniert jetzt und das tut es auch.

von Marco H. (damarco)


Lesenswert?

Also wenn dort der selbe stack läuft wie der zum download angebotene 
sehe ich schwarz.

Der hat ein dickes Bug und zwar wenn die Daten größer wie der Buffer 
ist.

Dann bekommt der Browser den ersten Teil doppelt. Das war die Ursache 
des nicht wohl geformten Javascript.

Beitrag "einfache und performante W5500 LIB"

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Thomas W. schrieb:
> Aber ich war immer der Meinung, das der Browser doch erst
> einmal warten müsste bis die mit "GET / usw. angeforderte
> Startseite auch wirklich bis zum letzten Byte beim
> Browser angekommen ist.

Das gilt für HTTP/1.0 und für HTTP/1.1 mit "Connection: close" bzw. ohne 
"Content-Length" auch, da der Browser dann erst mit dem Verbindungsende 
weiß, wieviele Bytes kommen.

Aber im Prinzip darf man auch mehrere Anfragen hintereinander schicken.

von Thomas W. (Gast)


Lesenswert?

Hallo Marco.
Ich verwende keine LIB W5500 und habe noch niemals eine LIB oder anderes 
Vorgefertigtes von anderen verwendet. Ich programmiere ausschließlich in 
Assembler und bisher habe ich immer meinen eigenen "Treibercode" für 
irgendwelche Hardware/Software geschrieben. Ich bin schon froh, wenn ich 
die Kommunikation über HTTP und HTML mit meinen Assembler Kenntnissen 
soweit hinbekomme das es funzt. Zu den ganz speziellen Eigenschaften von 
HTTP, HTML und Browser-Standards kann ich leider nicht viel Beitragen, 
da mir einfach das 100%´tige Wissen darüber fehlt. Deshalb Danke an 
dich, das du hier hilfreich mit unterstützt.
Gruß Tom.

von Marco H. (damarco)


Lesenswert?

Das Problem ist das Browser und der Http Server nun mal zusammen 
arbeiten ;) Man muss schon die andere Seite verstehen, sonst wird es 
schwierig.

Das HTTP Protokoll ist auch nicht so umfangreich. Das verhalten des 
Browser lässt sich mit deiner Seite beeinflussen. Hierzu gibt es Infos 
die der Http Server übermittelt. In der Regel richtet sich der Browser 
auch in diese.

Was ich er meinte ist dein Wiznet Modul, da ist ja ein ARM drauf und auf 
dem läuft der Stack.
Um zu verstehen was da passiert musste ich mich auch mit Http und 
Javascript beschäftigen.  Deine Aufgabe ist ja im Prinzip sehr einfach.

Die Statische Seite wird einmal geladen und das dynamische kommt per 
Javascript als JSON string.

um die werte von 4 ADC Kanäle zu übertragen wird nur folgender String 
angefordert.

Der Server liefert:

ADCStatusCallback({"ain":[{"v":"1880"}, {"v":"2209"}, {"v":"4095"}, 
{"v":"3171"}], "aout":[{"v":"100"}, {"v":"200"}]});

Das Javascript auf der anderen Seite zeigt die Werte dann dynamisch in 
deiner Webseite an. Das ganze kann man ohne Problem 300ms oder weniger 
abfragen da der Umfang der Daten extrem gering ist.

Deine Seite muss jedes mal neu geladen werden.

: Bearbeitet durch User
von Thomas W. (Gast)


Lesenswert?

Hallo Marco.
Da ich nicht so firm mit dem HTTP bin stelle ich hier mal das ein, was 
von meinem "Server" im ATmega über die UART und das WIZNET Modul als 
HTTP zurück an den Browser gesendet wird. Ist nicht viel, aber eventuell 
hast du eine Idee und kannst mir mal bitte schreiben, was eventuell noch 
hinein muß, damit das HTTP Protokoll professionell gestaltet ist.

Hier der Inhalt:
HTTP/1.1 200 OK CR LF Content-Length: 6510 CR LF Content-Language: de CR 
LF Content-Type: text/html CR LF Refresh:60 CR LF CR LF

Zuerst sende ich die Version 1.1 weil auch die Anfrage als 1.1 vom 
Browser gekommen war. Dann die 200 und OK als Zeichen das die Startseite 
vorhanden ist und alles OK zum senden ist. Dann die Anzahl der zu 
sendenden Bytes, dann die Sprache, dann den Typ der zu sendenden 
Textdatei (HTML), dann noch einen automatischen Refresh nach 60 Sekunden 
und zum Schluss 2x CR LF zum Beenden vom HTTP Protokoll. Dann beginnt 
das HTML ....

Hast du da noch eine Idee was verändert oder hinzugefügt werden müsste?

von Marco H. (damarco)


Lesenswert?

Ja

der Zeichensatz fehlt charset=utf-8 z.Bsp sonst hängt es davon ab was 
auf dem Rechner eingestellt ist.

Cache-control: no-cache

Connection: ->  https://en.wikipedia.org/wiki/HTTP_persistent_connection

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Thomas W. schrieb:
> Zuerst sende ich die Version 1.1 weil auch die Anfrage als 1.1 vom
> Browser gekommen war.

Du kannst auch mit HTTP/1.0 antworten, dann weiß der Browser wenigstens 
schon einiges, was du nicht kannst, z.B. mehrere Anfragen über eine 
Verbindung und Pipelining. :-)

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.