Hallo,
Ich nutze das Beispiel von Keil "simple_server"
das läuft auch alles super.
Nun meine Frage wie kann ich mir mit diesen Beispiel eine eigenen Seite
Bauen.
Ich wollte eigendlich nur 6 Led´s schalten.
Kann mir einer weiterhelfen.
Danke
Hallo,
Ich wollte für jede Led ein eigenen Button machen
Botton Status
Led 1 An
Led 2 Aus
Led 3 An
Led 4 An
Led 5 An
Wie kann ich die Buttons erstellen
Könnte mir dazu jemand weiter helfen
mfg
lies dir ein html tutorial durch...
wenn du fragen würdest, wie du die Buttons mit deiner LED verknüpfst,
könnte ich das ja nachvollziehen. Aber so eine Grundsatzfrage die von
Null Eigeninitiative zeugt ist schon...
Constantin schrieb:> Hallo,>> Ich wollte für jede Led ein eigenen Button machen
...
> Wie kann ich die Buttons erstellen> Könnte mir dazu jemand weiter helfen
1) HTML lernen
2) In Code schauen wo der Webserver die HTML-Seite "serviert"
3) Code entsprechend anpassen
4) Wundern warum's nicht geht und zurück zu 1), 2) oder 3)
Eric B. schrieb:> 1) HTML lernen
Moin,
sehr schön fand ich, zum erlernen von html, damals diese Seite:
http://de.selfhtml.org/
Ich hoffe das bringt dich etwas weiter!
Gruß
dat
Beast
Hallo,
Ich habe mich etwas belesn hab auch ein sehr gutes Tutorial gefunden,
habe die Page mal so gemacht wie ich mir das vorgestellt habe.
Aber ich kann keine LED ein oder aus schalten.
könnte sich das jemand mal anschauen
Hallo,
Ich habe mich etwas belesn hab auch ein sehr gutes Tutorial gefunden,
habe die Page mal so gemacht wie ich mir das vorgestellt habe.
Aber ich kann keine LED ein oder aus schalten.
könnte sich das jemand mal anschauen
0815 schrieb:> Dann zurück zu 1).
GUT DANKE FÜR DIE HILFE
Constantin schrieb:> Wie gesagt ich kann die Buttons malen das wird alles richtig angezeigt.> Aber die auswertung welcher button angeklickt wurde da weiss ich nich> weiter.
Das wundert mich nicht.
So
1
plen=fill_tcp_data_p(buf,plen,"<table border>");
2
plen=fill_tcp_data_p(buf,plen,"<thead>");
3
plen=fill_tcp_data_p(buf,plen,"<tr>");
4
plen=fill_tcp_data_p(buf,plen,"<thead>");
5
plen=fill_tcp_data_p(buf,plen,"<th> LED 1</th>");
6
plen=fill_tcp_data_p(buf,plen,"<th> LED 2</th>");
7
plen=fill_tcp_data_p(buf,plen,"<th> LED 3</th>");
8
plen=fill_tcp_data_p(buf,plen,"<tr>");
9
plen=fill_tcp_data_p(buf,plen,"<thead>");
10
plen=fill_tcp_data_p(buf,plen,"<tfoot>");
11
plen=fill_tcp_data_p(buf,plen,"<tr>");
12
plen=fill_tcp_data_p(buf,plen,"<td>AN/AUS</td>");
13
plen=fill_tcp_data_p(buf,plen,"<td>AN/AUS</td>");
14
plen=fill_tcp_data_p(buf,plen,"<td>AN/AUS</td>");
15
plen=fill_tcp_data_p(buf,plen,"<tr>");
16
plen=fill_tcp_data_p(buf,plen,"<thead>");
17
plen=fill_tcp_data_p(buf,plen,"<tfoot>");
18
plen=fill_tcp_data_p(buf,plen,"<tr>");
19
plen=fill_tcp_data_p(buf,plen,"</tbody>");
20
plen=fill_tcp_data_p(buf,plen,"</table>");
kriegst du ja nur eine Tabelle mit Texten. Das veranlasst den Web
Browser lediglich etwas an die Anzeige hinzumalen.
Überleg mal, wie du das auf normalen Web Seiten machst, wenn du auf
einer Web Seite eine Aktion machst. Entweder du klickst auf einen
speziell dargestellten Text, der als Link eine weitere HTML Seite von
einem Server abruft oder du füllst ein Formular aus
Also: Weiterlernen wie HTML funktioniert.
Wie macht man Links, wie macht man Formulare.
(Ich würde mir an deiner Stelle mal einen kleinen Web-Server für den PC
installieren, so dass du dich erst mal nur darauf konzentrieren kannst,
wie man eigentlich was in HTML macht ohne dich gleichzeitig auch noch
mit der entsprechenden C-Programmierung auseinander setzen zu müssen)
Es schadet auch nichts, wenn du dir vom Original ganz oben mal den HTML
Code ansiehst, der da generiert wird (im Browser).
Achte speziell auf den <a> Tag, der da entsteht und auf den Link auf den
er verlinken soll.
Karl Heinz schrieb:> Achte speziell auf den <a> Tag, der da entsteht und auf den Link auf den> er verlinken soll.
Bei der umsetzung hab ich schwierigkeiten.
Bei den oben genannten beispiel wird ja erstma nur eine Tabelle erzeugt,
Für LED1-LED3.
Wie mann daraus ein LINK macht das macht bekomm ich nich hin, die
Tutorials
im Web bekomm ich für mein Beispiel nicht hin.
kann mir vielleicht noch jemand helfen.
Mfg
Constantin schrieb:> Karl Heinz schrieb:>> Achte speziell auf den <a> Tag, der da entsteht und auf den Link auf den>> er verlinken soll.>>>> Bei der umsetzung hab ich schwierigkeiten.
Na schauh dir mal generell an, wie in HTML ein link gesetzt wird,
der besethet aus einem Referenz und Beschreibungsteil,
die Referenz ist der http Link selbst, der aufgerufen wird, wenn darauf
geklickt wird, und die Beschreibung ist der Text, der dann in der
Webseite angezeigt wird, in dem Fall.....
>> Bei den oben genannten beispiel wird ja erstma nur eine Tabelle erzeugt,> Für LED1-LED3.
genau, da ist in der Tabelle dann dein Text drin, der von dir vermutlich
angezeigt werden will , jetzt brauchst da nur noch einen link davor rein
setzen setzen..
>> Wie mann daraus ein LINK macht das macht bekomm ich nich hin, die> Tutorials im Web bekomm ich für mein Beispiel nicht hin.
Na HTML und LINK ist dein Stichwort
schauh dir das mal an:
http://www.google.de/search?hl=de&source=hp&q=html+link&gbv=1http://de.selfhtml.org/html/verweise/definieren.htm
jetzt aber los, bin schon auf deine webseite gespannt!
;-)
"Der Beitrag scheint Spam zu enthalten: """
na ja - dann häng ich meinen beitrag mal als txt ran, weiss nicht warum
mir die forensoft es verwehrt :)
lg
rudi :)
plen=fill_tcp_data_p(buf,plen,"<td>< a href =\"/0\">AUS</ a></td>");
Der link hat eine absolute Addresse im vormat /nummer, analyse_get_url
erwartet eine url im format /passwort/nummer, ersetze "/0" durch "0"
PS: ich würde den code wie folgt abändern, dann ist es einfacher zu
lesen:
1
// ungetestet
2
3
u8verify_password(char*str,intmax)
4
{
5
// the first characters of the received string are
Constantin schrieb:> Ich habe das jetzt so das ich die LEDs ein und ausschalten abe rso> richtig funktioniert das nicht .
Was genau funktioniert daran nicht?
Folgendes ist mir noch aufgefallen:
Daniel A. schrieb:>> Folgendes ist mir noch aufgefallen: plen = fill_tcp_data_p(buf, plen,> PSTR("<td><""a href""=\/888\/1\>AN/AUS</td></""a>"));> Da fehlen zwei Anfürungszeichen, und es muss immer zuerst der zuletzt> geöffnete html tag geschlossen werden. plen = fill_tcp_data_p(buf,> plen, PSTR("<td><""a href""=\"/888/1\">AN/AUS</""a></td>"));>> PS: Kann endlich mal jemand diese "Der Beitrag scheint Spam zu> enthalten" meldungen ausschalten? HTML code wird hier doch sowiso nicht> ausgefürt.
Wenn ich das so mache kann ich nur noch LED1 an aus schalten.
so wie im anhang kann ich die LED1-3 JEWEILS GETRENT EIN UND
AUSSCHALTEN.
Aber wenn ic Led1 einschalte dann steht auch auf der Webpage LED2 an
LED3 an
und wenn ich LED1 ausschalte steht das bei LED2 und LED3 auch da.
wie kan ich das ändern
Constantin schrieb:> Wenn ich das so mache kann ich nur noch LED1 an aus schalten.
Das halte ich für absolut unmöglich.
> wenn ich LED1 ausschalte steht das bei LED2 und LED3 auch da.> wie kan ich das ändern
Mit einer korrekten logik. Du betrachtest im Programm im Anhang in der
print_webpage nur den parameter on_off, die nur die information über die
soeben aktivierte led enthält. Du benötigst aber dass array st, in dem
du bereits alle led statuse abgespeichert hast.
Zudem gibt es einiges an redundantem code und überflüssigen funktions
aufrufen.
Dashier:
1
plen=fill_tcp_data_p(buf,plen,"<table border>");
2
plen=fill_tcp_data_p(buf,plen,"<thead>");
3
plen=fill_tcp_data_p(buf,plen,"<tr>");
4
plen=fill_tcp_data_p(buf,plen,"<thead>");
5
plen=fill_tcp_data_p(buf,plen,"<th> LED 1</th>");
6
plen=fill_tcp_data_p(buf,plen,"<th> LED 2</th>");
7
plen=fill_tcp_data_p(buf,plen,"<th> LED 3</th>");
8
plen=fill_tcp_data_p(buf,plen,"<tr>");
9
plen=fill_tcp_data_p(buf,plen,"<thead>");
10
plen=fill_tcp_data_p(buf,plen,"<tfoot>");
11
plen=fill_tcp_data_p(buf,plen,"<tr>");
ist equivalent zu:
1
plen=fill_tcp_data_p(buf,plen,
2
"<table border>"
3
"<thead>"
4
"<tr>"
5
"<thead>"
6
"<th> LED 1</th>"
7
"<th> LED 2</th>"
8
"<th> LED 3</th>"
9
"<tr>"
10
"<thead>"
11
"<tfoot>"
12
"<tr>"
13
);
Wenn man die überflüssigen funktionsaufrufe nicht beachtet.
So fällt auch sofort auf, das mit dem html etwas nicht stimmen kann,
sollte eher so aussehen:
1
plen=fill_tcp_data_p(buf,plen,
2
"<table border>"
3
"<thead>"
4
"<tr>"
5
"<th> LED 1</th>"
6
"<th> LED 2</th>"
7
"<th> LED 3</th>"
8
"</tr>"
9
"</thead>"
10
"<tfoot>"
11
"<tr>"
12
);
Die abfrage der aktiven leds kann dann so aussehen:
Hallo,
Ich habe das jetzt mal umgeändert allerdings erhalte ich jetzt nur ein
Button zum anklicken.
Die seite ist im anhang
kann mir da noch eiener weiterhelfen
danke
Hallo,
dein Problem ist das du alle Fälle einzeln abfragst aber immer die
komplette Tabelle erstellst, dadurch erhälst du natürlich auch nur einen
Link. Du musst die Tabelle nur einmal erstellen, und nur die Zeilen die
den Link/Button erstellen in der Schleife ausgeben.
Und: wenn du es endlich mal schaffen würdest die HTML-Tags in der
richtigen Reihenfolge zu schließen?!
Sascha
Constantin schrieb:> kann mir da noch eiener weiterhelfen
Irgendwie ist der Code für
1
//LED 1 AUS
abhanden gekommen.
> Ich habe das jetzt mal umgeändert allerdings erhalte ich jetzt nur ein> Button zum anklicken.
Womit initialisierst du denn st[]?
Statt auf "==0" und "==1" zu testen, ist es günstiger, auf "true" und
"false" zu prüfen.
Sascha Weber schrieb:>> Und: wenn du es endlich mal schaffen würdest die HTML-Tags in der> richtigen Reihenfolge zu schließen?!>
Das hab ich den Tutorials nicht gefunden wie mann die HTML-Tags
schliesst.
so wie im Anhang geht es erstmal, da ist das Schliessen der HTML-Tags
noch nicht drin.
Constantin schrieb:> Das hab ich den Tutorials nicht gefunden wie mann die HTML-Tags> schliesst.
hmm? Obwohl du es schon tust
Bsp.
Tag: <tr>
schließender Tag: </tr> , Slash voranstellen
wenn verschiedene Elemente wie in der Tabelle ineinander verschachtelt
werden so müssen die Elemente auch in der umgekehrten Reihenfolge wieder
geschlossen werden.
Wie hier schon beschrieben ...
Beitrag "Re: Webpage Webserver"> so wie im Anhang geht es erstmal, da ist das Schliessen der HTML-Tags> noch nicht drin.
Das geht nur weil es der Browser meist nicht nicht so genau nimmt.
Sascha
Zusätzlich unterscheidet man zwischen block und inline elementen.
In html müssen alle block elemente einen separaten schliesenden tag
haben. Beispiel:
<div><b>Blockelemente</b></div>
Inline elemente werden sofort geschlossen:
<img/><input/><br/>
Viele lassen den letzten släsh weg:
<input><br>
Das finde ich aber genauso schlimm wie das weglassen der schlissenden
option tags in selects.
Zudem ist zu beachten das Inline und Block elemente nichts mit der css
eigenschafent display:inline und display:block zutuhen haben.
XML ist hier deutlich einfacher, mann darf dort selbst entscheiden, ob
man dass element sofort schliest oder einen seperaten schliesenden tag
verwended.
Hallo,
Für 2 Led's gehts erstmal.
Nun wollte ich das erweitern für 12 Led's
und nun wird die Website auch nicht mehr angezeigt und der controller
reset.
Wie kann mann dies machen um eine Grössere Webpage anzuzeigen.
mfg
Constantin schrieb:> der controller reset
Wie sieht der Code momentan aus?
Ohne dehn können wir nicht sagen, warum der Controller resetet. Dafür
kann es viele Ursachen geben.
Constantin schrieb:> Eric B. schrieb:>> Dann mal wieder zurück zu 1) !!>> Das hilft mir jetzt aber nicht so weiter warum der controller sich> resetet.
sollte der Puffer tatsächlich voll werden (sieht mir gar nicht so viel
aus) dann musst du die anfallenden Daten in mehrere Pakete aufteilen.
Und die Tags sehen immer noch ziemlich verwirrend aus.
Schließen in umgekehrter Reihenfolge!
Sascha
Sascha Weber schrieb:> Constantin schrieb:> Eric B. schrieb:>> sollte der Puffer tatsächlich voll werden (sieht mir gar nicht so viel> aus) dann musst du die anfallenden Daten in mehrere Pakete aufteilen.
Könnten sie mir das nochmal erklären wie mann dies macht in 2 packete.
ich hatte dies selber schon versucht aber die seite wird mir dann nicht
angezeigt.
>> Und die Tags sehen immer noch ziemlich verwirrend aus.> Schließen in umgekehrter Reihenfolge!>
Ich schliesse ja die tags mit /d
kann mir jemand das richtig zeigen wenn möglich.
Danke
mfg
Constantin schrieb:> ich nehme an das der Buffer (buf) überläuft die grösse ist 1500.
Im oberen code wird der Buffer mit rund 800 zeichen aufgefüllt; es würde
schon ausserordentliches tallent erfordern, in der Auffülfunktion
weitere 700 bytes zu verschwenden: Der buffer ist gross genug (
schliesst den overflow aber nicht aus ).
Constantin schrieb:>> sollte der Puffer tatsächlich voll werden (sieht mir gar nicht so viel>> aus) dann musst du die anfallenden Daten in mehrere Pakete aufteilen.>> Könnten sie mir das nochmal erklären wie mann dies macht in 2 packete.> ich hatte dies selber schon versucht aber die seite wird mir dann nicht> angezeigt.
Das ist der falsche Zeitpunkt, um es in 2 Packete zu unterteilen. Zuerst
muss das Problem eindeutig lokalisiert werden. Dazu ist ein Debugger
notwendig.
Hallo,
Im Anhang nochmal der aktuelle stand.
Ich muss dies hier für Led3 Ausklammern damit die Seite überhaupt
angezeigt wird.
Ein Reset tritt jetzt nicht mehr auf.
Aber an was liegt das.
mfg
Stell doch erst mal dein HTML richtig.
Wenn ich Browser wäre, würde ich das auch nicht mehr anzeigen wollen.
Wenn etwas mit
1
<html>
eingeleitet wird, dann muss es auch ein entsprechendes
1
</html>
geben, so dass die beiden 'Anweisungen' das eingeschlossene Klammern.
Du erzeugst momentan( und ich breche ein wenig um, damit man was sieht)
(Ich musste es leider als Dateianhang anhängen, weil ich das HTML sonst
nicht durch den Spamfilter kriege)
Da stecken doch haufenweise Fehler drinnen.
Mehr Sorgfalt!
Da haben sich die Browser-Hersteller der ersten Stunde einiges
eingefangen, als sie im vorauseilender guter Absicht die Browser so
gebaut haben, dass sie auch fehlerhaftes HTML akzeptieren und so gut es
geht reparieren. Jetzt haben sie den Salat. Hätten sie von Anfang an
einfach nur den Browser einen Fehler ausgeben lassen, wären wir heute
nicht in der Situation, dass jeder der bis 3 zählen kann, Web Seiten
machen will.
Wenn du den HTML Aufbau in Form von Ausgabeanweisungen in einem C
Programm nicht mehr überblicken kannst, dann schreib ihn dir halt in
einer eigenen Textdatei einfach mal vor, so wie ich das da gemacht habe.
Du kannst deinen Browser auf dieses File dann loslassen und nachsehen,
wie das dann aussieht. Du musst auch nicht gleich alles in dieses File
einbauen. Man kann und darf da ruhig zb erst mal mit einem ganz simplen
HTML loslegen und das dann immer um ein kleines bischen mehr ergänzen,
solange nur das HTML in sich selbst richtig ist.
Wenn dann alles soweit fertig ist, DANN baust du das in dein C Programm
in Form von Programmzeilen ein. Von mir aus ebenfalls in Schüben, indem
du mit einer mehr oder weniger leeren Seite beginnst und dann die immer
weiter innen liegenden Teile mit dazunimmst. Dann weisst du auch, dass
da erst mal gültiges HTML rauskommen wird.
Marc schrieb:> html, body und td müssen auch nicht geschlossen werden.
Quelle?
Nur weil Browser diese Fehler ignorieren, heisst das noch lange nicht,
dass es ok ist.
Der HTML-Standard. Und nicht erst seit HTML5.
Such nach optional tags. Oder nach einem der dreißigtausend Blogposts
all derjenigen, die das "Feature" neu entdeckt haben und begeistert
davon berichten.
Das kürzeste valide HTML-Dokument lautet:
<!doctype html>
Das wars. Jag es durch den Validator.
Dann probiere noch
<!doctype html>
<p>Hallo.
Sollte auch valide sein, wenn ich nicht einen Denkfehler gemacht habe.
Marc schrieb:> die das "Feature" neu entdeckt haben und begeistert> davon berichten.
Aus den Anführungszeichen schliesse ich, dass du darüber genauso denkst
wie ich :-)
Naja, es spart Bytes. Wenn man nicht von Hand schreibt, sondern
generiert, dann ist das m.E. legitim.
Zumal die resultierende Dokumentateuktur eindeutig definiert ist.
Aber klar, von Hand läßt man das lieber.
Hallo,
ich habe mir mal das Beispiel von der Keilseite Http_demo mal versucht
da ist ja alles richtig Geschrieben, aber trotzdem stürzt mir der
Controller beim Aufruf der Seite ab.
Woran liegt das.
mfg
Hallo,
Ich bekomme das nicht hin das mir die Seite so angezeigt wie ich das
gern wollte.
Kann ja nicht sein das nur 2 Schaltflächen gehen und bei der dritten
hängt sich alles auf.
Vielleicht kann mir nochmal jemand weiterhelfen
mfg
Mit welchem Teil von
Bring doch erst mal dein HTML in Ordnung
hast du eigentlich Schwierigkeiten?
Du generierst die ganze Zeit Dinge wie zb
1
<table>
2
<tr>
3
<td>Spalte 1</td>
4
<td>Spalte 2</td>
5
<tr>
6
<tr></tr>
7
<td> Spalte 1</td>
8
<td> Spalte 2</td>
9
<tr></tr>
10
</table>
Bring das endlich in Ordnung!
Die Reihenfolge ist wirklich sehr simpel.
Eine Tabelle besteht aus Zeilen.
Eine Zeile besteht aus Spalten.
Das muss richtig ineinander geschachtelt werden. Mittels <tr> beginnt
eine Zeile, Und beim </tr> endet sie wieder. Dazwischen stehen die
einzelnen Spalten. Jede Spalte beginnt mit <td> und sie endet mit dem
</td>
Also nicht so wie da oben deine 2.te Tabellenzeile, sondern so
1
<table>
2
<tr>
3
<td>Zeile 1, Spalte 1</td>
4
<td>Zeile 1, Spalte 2</td>
5
</tr>
6
7
<tr>
8
<td>Zeile 2, Spalte 1</td>
9
<td>Zeile 2, Spalte 2</td>
10
</tr>
11
</table>
versuch doch wenigstens zu verstehen, wie sich da die Dinge ineinander
schachteln!
(Und nein ich würde mein Heil nicht in 'optionalen Tags' legen. Mach es
ordentlich und mach es richtig. Dann bist du nicht darauf angewiesen,
dass der Browser stillschweigend ergänzt, was du versäumt hast.
Abgesehen davon, kann man bei <td> oder <tr> immer nur das Endtag
weglasssen. Aber ein <td> zieht kein automatisches <tr> nach sich.)
Ich rate dir doch nicht aus Spass an der Freude, dass du mal mit einem
Texteditor ein HTML File schreibst und das mit deinem Browser
ausprobierst, wie es richtig sein muss und dass du dir im Browser den
HTML-Source Code ansehen sollst, der da daherkommt.
Du hampelst da jetzt schon seit Tagen rum, anstatt dir wenigstens mal
rudimentäre Kenntnisse anzueignen. Wenn du das endlich mal alles
korrigieren würdest (und es ist mir ehrlich gesagt scheissegal, ob das
ein Beispiel von Keil ist oder nicht), dann wäre das schon mal eine
Fehlerquelle weniger, warum dein Browser nichts anzeigt.
Man könnte mal mit einer ganz einfachen Web Page anfangen und die im
Code so einbetten, dass man auch im Code sehen kann, wie da die Dinge im
HTML zusammengehören.
1
u16print_webpage(u8*buf,u8on_off)
2
{
3
u16plen;
4
u8i;
5
// the url looks like this http://baseurl/password/command
Man könnte auch anstatt den immer gleichen falschen Code
weiterzukopieren, sich ein für allemal mal eine Funktion schreiben, die
für eine LED eine korrekte Tabellenzeile ausgibt.
PS:
Für welchen Prozessor schreibst du jetzt eigentlich?
Teileweise steht da was von einem Mega88 im Code, dann wieder wird ein
Header File includiert, der ganz offensichtlich zu einem STM32 gehört.
Karl Heinz schrieb:> PS:>> Für welchen Prozessor schreibst du jetzt eigentlich?> Teileweise steht da was von einem Mega88 im Code, dann wieder wird ein> Header File includiert, der ganz offensichtlich zu einem STM32 gehört.
für einen STM32
Damit kann ich ja erstmal n bischen "spielen".
jetzt hab hab ich nochmal eine Frage wie kann ich ein bild auf der seite
anzeigen.
plen = fill_tcp_data(buf, plen, "<img border=\"0\" src=\"st_logo_gif\"
width=\"86\" height=\"65\">\r\n");
aber das wird so nicht angezeigt.
in den Tutorials ist das ja fürn PC beschrieben
Constantin schrieb:> jetzt hab hab ich nochmal eine Frage wie kann ich ein bild auf der seite> anzeigen.>> plen = fill_tcp_data(buf, plen, "<img border=\"0\" src=\"st_logo_gif\"> width=\"86\" height=\"65\">\r\n");>> aber das wird so nicht angezeigt.
Die Daten in der Datei st_logo.c sind fehlerfrei.
Der obere img-tag auch, wobei ich die Datei st_logo.gif statt
st_logo_gif nenen würde.
Du musst nur-noch den Server dazu bringen die Datei mit dem korrekten
Content-type bei einer Anfrage auf die im img-tag angegebene Adresse
senden zu lassen. Jetzt hast du das Glück endlich ein Problem zu Lösen,
dass sich vermutlich nicht mit Copy & Paste und leichten Anpassungen
lösen lassen wird. Überleg dir einfach ganz genau, was der Server in
welcher Reihenfolge tun muss, und schreib es in C-Code auf.
Viel Glück! Die Erfahrung, die man sammelt, wenn man selbst ein Problem
ganz oder teilweise löst ist einfach unbezahlbar. Mal sehen wie weit du
kommst...
> in den Tutorials ist das ja fürn PC beschrieben
Das macht nur Server-seitig einen Unterschied, und viele HTML-Tutorials
erwähnen den Server ja sowieso nicht.
PS: Da in letzter zeit diese HEX-Byte-Arrays in .c Files häufiger zu
werden scheinen, habe ich folgenden JavaScript geschrieben und als
Bookmark in Google Chrome gespeichert:
Daniel A. schrieb:> Constantin schrieb:>> jetzt hab hab ich nochmal eine Frage wie kann ich ein bild auf der seite>> anzeigen.>>>> plen = fill_tcp_data(buf, plen, "<img border=\"0\" src=\"st_logo_gif\">> width=\"86\" height=\"65\">\r\n");>>>> aber das wird so nicht angezeigt.>> Die Daten in der Datei st_logo.c sind fehlerfrei.> Der obere img-tag auch, wobei ich die Datei st_logo.gif statt> st_logo_gif nenen würde.>> Du musst nur-noch den Server dazu bringen die Datei mit dem korrekten> Content-type bei einer Anfrage auf die im img-tag angegebene Adresse> senden zu lassen. Jetzt hast du das Glück endlich ein Problem zu Lösen,> dass sich vermutlich nicht mit Copy & Paste und leichten Anpassungen> lösen lassen wird. Überleg dir einfach ganz genau, was der Server in> welcher Reihenfolge tun muss, und schreib es in C-Code auf.> Viel Glück! Die Erfahrung, die man sammelt, wenn man selbst ein Problem> ganz oder teilweise löst ist einfach unbezahlbar. Mal sehen wie weit du> kommst...>>> in den Tutorials ist das ja fürn PC beschrieben> Das macht nur Server-seitig einen Unterschied, und viele HTML-Tutorials> erwähnen den Server ja sowieso nicht.>
Für sie ist das einfach zu lösen für mich ist das sehr schwer da ich
keine richtigen Beispiele finden kann wo mann selbst ein bischen sich
versuchen kann.
Ich versuche das nun schon seit Tagen aber ich bekomm das nicht hin,
Hiermit teile ich ja den Browser mit das er mir das Bild Anzeigen soll.
plen = fill_tcp_data_p(buf, plen,"HTTP/1.0 200 OK\r\nContent-Type:
image/gif\r\nPragma: cache\r\n\r\n");
plen = fill_tcp_data(buf, plen, "<img border=\"0\" src=\"st_logo_gif\"
width=\"86\" height=\"65\">\r\n");
Aber im Browser steht dann nur "<img border=\"0\" src=\"st_logo_gif\"
width=\"86\" height=\"65\">
Constantin schrieb:> Ich versuche das nun schon seit Tagen aber ich bekomm das nicht hin,>> Hiermit teile ich ja den Browser mit das er mir das Bild Anzeigen soll.> plen = fill_tcp_data_p(buf, plen,"HTTP/1.0 200 OK\r\nContent-Type:> image/gif\r\nPragma: cache\r\n\r\n");>> plen = fill_tcp_data(buf, plen, "<img border=\"0\" src=\"st_logo_gif\"> width=\"86\" height=\"65\">\r\n");>> Aber im Browser steht dann nur "<img border=\"0\" src=\"st_logo_gif\"> width=\"86\" height=\"65\">
als erstes solltest du dir im Browser mal anschauen ob dort das richtige
ankommt. Mit FF kannst du das über Webentwickler/Webkonsole/Netzwerk,
dann siehst du was dein Browser anfordert und was daraufhin vom Server
zurückkommt. Das sollte schon mal den entscheidenden Hinweis auf den
Fehler geben.
Sascha
Constantin schrieb:> Die Webseite wird ja auch nich richtig angezeigt.
auch hier würden dir die eingebauten Debugfunktionen im FF warscheinlich
weiterhelfen - wenn du sie benutzen würdest
> Wenn ich das Ausgeblendete wieder aktiv mache wird die Webseite nicht> angezeigt.
für den oberen Block fehlt auf jeden Fall schon mal das einleitende
'tr'.
Im unteren Block hat die Zeile mit dem Contenttype dort überhaupt nichts
verloren!
Dein Browser schickt für die Bild-URL eine neue Anfrage an deinen
Server, die der dann mit dem gif Contentheader beantworten muss, gefolgt
von den Bilddaten.
Sascha
Sascha Weber schrieb:> Constantin schrieb:>> Die Webseite wird ja auch nich richtig angezeigt.> auch hier würden dir die eingebauten Debugfunktionen im FF warscheinlich> weiterhelfen - wenn du sie benutzen würdest>>> Wenn ich das Ausgeblendete wieder aktiv mache wird die Webseite nicht>> angezeigt.> für den oberen Block fehlt auf jeden Fall schon mal das einleitende> 'tr'.
Wenn ich den Ausgeklammerten Bereich aktiviere kann ich die Seite im
Browser nicht Aufrufen.
Beitrag "Re: Webpage Webserver"
Wenn ich zb schreibe,
plen = fill_tcp_data(buf, plen, " <tr>\r\n");
plen = fill_tcp_data(buf, plen, " <td>LED 5</td>\r\n");
plen = fill_tcp_data(buf, plen, " </tr>\r\n");
Das Ausgeklammerte bleibt aktive kann ich die seite ebenfalls nicht mehr
anzeigen.
> Im unteren Block hat die Zeile mit dem Contenttype dort überhaupt nichts> verloren!> Dein Browser schickt für die Bild-URL eine neue Anfrage an deinen> Server, die der dann mit dem gif Contentheader beantworten muss, gefolgt> von den Bilddaten.>> Sascha
Ich habe kein Beispiel wie das mit den Bilddaten gemacht wird im Netz
gefunden,die Beispiele die es gibt sind ja alle nur fürn PC.
Constantin schrieb:> Ich habe kein Beispiel wie das mit den Bilddaten gemacht wird im Netz> gefunden,die Beispiele die es gibt sind ja alle nur fürn PC.
Das sind doch wohl zwei paar Schuhe - ob PC oder nicht ist an der Stelle
völlig egal. Du wirst kein Beispiel finden wie der PC die Bilddatei
bereistellt, es sei den du willst am PC einen eigenen Webserver
schreiben.
Du musst halt nur verstehen was der Webserver zu tun hat und was der
Browser. Das Einbinden des Bildes innerhalb der HTML-Datei mit img-Tag
hast du völlig korrekt gemacht. Daraufhin will der Browser vom Webserver
eine Datei mit dem Namen aus dem entsprechendem src-Attribut laden. Die
musst du auf dem Server mit einer eigenen Funktion bereitstellen, so
ähnlich wie du bisher schon deine HTML-Seite bereistellst.
Sascha
Constantin schrieb:> ich habe mir mal das Beispiel von der Keilseite Http_demo mal versucht> da ist ja alles richtig Geschrieben, aber trotzdem stürzt mir der> Controller beim Aufruf der Seite ab.
Ich habe eine neue Absturztheorie: In deinem Quellcode wird manchmal
fill_tcp_data und manchmal fill_tcp_data_p verwendet. fill_tcp_data
kopiert Daten aus dem ram, während fill_tcp_data_p daten mit progmem aus
dem EEPROM ausliest.
Bei Soetwas:
Constantin schrieb:> plen = fill_tcp_data_p(buf, plen, PSTR("<td bgcolor='#A9ED61'><form> method=get><input type=submit name=6> value='ausschalten'></form></td>\r\n"));
Staddessen immer so schreiben:
> plen = fill_tcp_data(buf, plen, PSTR("<td bgcolor='#A9ED61'><form> method=get><input type=submit name=6> value='ausschalten'></form></td>\r\n"));
Das wurde wohl von allen durch die offensichtlicheren Probleme
übersehen. Ich verstehe nur nicht wieso es offenbar manchmal
funktioniert...
Daniel A. schrieb:> Staddessen immer so schreiben:> plen = fill_tcp_data(buf, plen, PSTR("<td bgcolor='#A9ED61'><form> method=get><input type=submit name=6> value='ausschalten'></form></td>\r\n"));>> Das wurde wohl von allen durch die offensichtlicheren Probleme> übersehen. Ich verstehe nur nicht wieso es offenbar manchmal> funktioniert...
hab ich ja auch so gemacht.
Trotzdem muss ich den unteren bereich ausklammern damit die seite
angezeigt wird.
egal was nun noch hinzufüge nach Led5
Die seite wird nicht mehr angezeigt.
Hallo,
also deine HTM von oben lässt sich fehlerfrei anzeigen.
Die Größe der Datei beträgt 1492 Byte und liegt damit schon oberhalb für
TCP spezifizierten Größe von ca. 1460 Byte. Wenn du noch weitere Zeilen
an deine Tabelle anfügen willst musst du die Daten die du mit
'fill_tcp_data' in 'buf' kopierst irgendwie aufteilen, innerhalb der
Funktion 'print_webpage' wird das natürlich schwierig. Du müsstest nach
jedem 'fill_tcp_data' die zurückgegebene Länge auf einen Schwellwert
prüfen der dafür sorgt das beim nächsten 'fill_tcp_data' die 1460 Byte
noch nicht überschritten werden. Wenn der Schwellwert erreicht ist musst
die Daten erst mal versenden (beginnt bei Dir mit SENDTCP:).
Der Aufbau deiner Funktion die den Server derzeit abwickelt ist in
dieser Art weder dazu geeignet anstehende Daten in mehreren Paketen zu
versenden noch das versenden von verschiedenen Dateien zu ermöglichen.
Damit währen wir auch gleich beim versenden der Bilddaten, in die
Funktion 'print_webpage_PICTURE' gehört nur das hinzufügen den Arrays
'st_logo_gif[]' das 'img ...' gehört in die HTML-Datei, und der
Response-Header in die Serverfunktion. Diese beantwortet bei die aber im
Moment alle eingedenden Pakete die ein GET enthalten mit dem
Response-Header für HTML. An der Stelle musst du erst mal prüfen welche
Datei der Client von deinem Server haben will und dann den
entsprechenden Header senden und dich im Anschluss darum kümmern das die
dazugehörigen Daten bereitgestellt werden.
Ich glaube, um ans Ziel zu kommen, du solltest lieber auf was fertiges
aufsetzen.
Sascha
Sascha Weber schrieb:> Hallo,>> also deine HTM von oben lässt sich fehlerfrei anzeigen.> Die Größe der Datei beträgt 1492 Byte und liegt damit schon oberhalb für> TCP spezifizierten Größe von ca. 1460 Byte. Wenn du noch weitere Zeilen> an deine Tabelle anfügen willst musst du die Daten die du mit> 'fill_tcp_data' in 'buf' kopierst irgendwie aufteilen, innerhalb der> Funktion 'print_webpage' wird das natürlich schwierig. Du müsstest nach> jedem 'fill_tcp_data' die zurückgegebene Länge auf einen Schwellwert> prüfen der dafür sorgt das beim nächsten 'fill_tcp_data' die 1460 Byte> noch nicht überschritten werden. Wenn der Schwellwert erreicht ist musst> die Daten erst mal versenden (beginnt bei Dir mit SENDTCP:).>> Der Aufbau deiner Funktion die den Server derzeit abwickelt ist in> dieser Art weder dazu geeignet anstehende Daten in mehreren Paketen zu> versenden noch das versenden von verschiedenen Dateien zu ermöglichen.
Das hab ich mir schon gedacht das dies nicht so einfach machbar ist.
> Damit währen wir auch gleich beim versenden der Bilddaten, in die> Funktion 'print_webpage_PICTURE' gehört nur das hinzufügen den Arrays> 'st_logo_gif[]' das 'img ...' gehört in die HTML-Datei, und der> Response-Header in die Serverfunktion. Diese beantwortet bei die aber im> Moment alle eingedenden Pakete die ein GET enthalten mit dem> Response-Header für HTML. An der Stelle musst du erst mal prüfen welche> Datei der Client von deinem Server haben will und dann den> entsprechenden Header senden und dich im Anschluss darum kümmern das die> dazugehörigen Daten bereitgestellt werden.>> Ich glaube, um ans Ziel zu kommen, du solltest lieber auf was fertiges> aufsetzen.
Ich suche schon den ganzen Monat im Netz nach Beispielen wie so etwas
gemacht wird.
was ich hier im Forum gefunden habe ist dieser "ARM-Webserver_uIP" aber
das ist dermaßen aufgebläht.
ich wollte ja nur ein Paar Ausgänge schalten und ein Bild anzeigen.
>Sascha
Vielen dank das sie so Gedult mit mir haben,gibt es denn irgendwo eine
Seite oder ein example code den ich mir anschauen kann und selbst dabei
etwas lernen kann.
Constantin schrieb:> Ich suche schon den ganzen Monat im Netz nach Beispielen wie so etwas> gemacht wird.> was ich hier im Forum gefunden habe ist dieser "ARM-Webserver_uIP" aber> das ist dermaßen aufgebläht.> ich wollte ja nur ein Paar Ausgänge schalten und ein Bild anzeigen.
Als erstes muss dir erst mal klar werden, wie das eigentlich
funktioniert und wer was macht.
Das ganze ist ein Wechselspiel aus Server und Browser.
Wenn der Browser etwas vom Server will, dann schickt er ihm einen GET
Request. Ein GET Request ist so zu verstehen, dass der Browser dem
Server mitteilt, welche Datei er haben will. Und der Server liefert die
dann. Im Normalfall liefert der Server den Quelltest für die HTTP Seite
aus (entweder in dem er keinen Dateinamen angibt oder indem er nach
index.htm fragt). In diesem HTML QUuelltext, den der Server ausliefert,
zb dem hier
1
<html>
2
<body>
3
<imgsrc="hugo.gif">
4
</body>
5
</html>
wird ein img Tag gemacht, in dem angegeben ist, dass an dieser Stelle
die Datei hugo.gif anzuzeigen ist. Die hat der Browser natürlich erst
mal nicht. Also geht der Browser her und schickt eine neue GET Anfrage
an den Server, in dem er die Datei 'hugo.gif' anfordert, die der Server
dann zu liefern hat.
Das ganze ist also ein Wechselspiel
So wie ich das sehe, kommt dein Code bei einem GET Request bis zu dieser
Stelle:
1
....
2
}
3
4
5
6
7
// if (cmd==-2) or any other value
8
// just display the status:
9
10
plen=print_webpage(buf,(i));
11
// plen = print_webpage_PICTURE(buf, (i));
12
....
und an dieser Stelle wird nicht mehr weiter unterschieden, was der
Browser eigentlich für eine Datei haben wollte. Hier wird immer mit dem
HTML Code geantwortet.
Und das musst du ändern.
Hier musst du analysieren, was der Browser eigentlich haben wollte,
welche Datei (wenn überhaupt) im GET Request angegeben wurde. Und die
lieferst du dann. Eine entsprechende Funktion, die Bilddaten ausliefern
kann, hast du ja schon im Code.
(und PS: den img Tag aus
nimmst du wieder raus.
Die Funktion wird aufgerufen, wenn Bilddaten auszuliefern sind. An
dieser Stelle geht es nicht mehr um HTML Code. Der Browser will von dir
die Bytes haben, die das Bild ausmachen. Und die hast du auszuliefern)
> Vielen dank das sie so Gedult mit mir haben,gibt es denn irgendwo eine> Seite oder ein example code den ich mir anschauen kann und selbst dabei> etwas lernen kann.
Dein Hauptproblem ist, dass dir einfach nicht klar ist, wie das
Wechselspiel aus Server und Browser funktioniert. Der Server macht von
sich aus gar nichts. Es ist der Browser, der vom Server Dateien
anfordert, den Inhalt (wenn es sich um HTML handelt) analysiert und
daraufhin gegebenenfalls weitere Dateien vom Server anfordert.
Dazu: muss erstens das HTML welchers der Server ausliefert fehlerfrei
sein
Und zweitens muss dieses jetzige schwindlige Parsing der GET Anfrage vom
Browser im Server mal ordentlich gemacht werden.
Ah, ja. Darauf hab ich noch vergessen.
In der GET Anfrage vom Browser ist ja auch noch das Password mit
drinnen.
Und ja. Da wirst du programmieren müssen.
Mit dem auskommentieren von ein paar Codezeilen bzw. dem Austausch von
ein paar Texten die ausgegeben werden, ist es da nicht mehr getan.
Dieser 'simple Server' kann nicht mit Anfragen nach unterschiedlichen
'Dateien' umgehen. Genauso, wie er das Buffer Längen Problem ganz
einfach ignoriert. Drum heisst er wahrscheinlich auch 'SimpleServer',
weil er eben simpel aufgebaut ist.
Hast du deinen STM eigentlich an einem Terminal hängen, an dem du dir
unabhängig von allem anderen Texte ausgeben lassen kannst?
Wenn ja: lass dir halt einfach mal die Anforderung vom Server ausgeben.
Dann siehst du, was der Browser vom Server will, und kannst dir in
weiterer Folge auch Ausgaben machen lassen, mit denen du verfolgen
kannst, warum dein Programm was macht.
Wenn nein: schwerer Fehler.
Programmentwicklung ohne dem Programm während des Durchlaufs auf die
Finger sehen zu können, erfordert dass man genau weiss was man tut bzw.
was man tun müsste. Und an genau letzterem scheint es massiv zu mangeln.
Da ich weder einen STM32 noch einen enc28j60 habe, aber diesen dringend
benötigen würde um den Code zu testen, habe ich einen minimalistischen
SHIM für den enc28j60 basierend auf linux-raw-sockets geschrieben. Ich
kann nun nach minimalen Code-Anpassungen den Code mit dem gcc unter
Ubuntu compilieren und die Seite im Browser aufrufen.
Der SHIM befindet sich im Anhang. Um ihn verwenden zu können muss man in
der Datei enc28j60emu.c in folgender Zeile das network interface
eintragen:
1
char*ifname="wlan1";
Zudem muss im simpleServer die MAC-Adresse des entsprechenden interfaces
eingetragen werden.
Als IP kann jede im gleichen subnet vewendet werden.
Die Informationen können mit dem Befehl ifconfig in der shell ermittelt
werden.
PS: Ich werde Morgen anfangen einen komplett neuen eigenen Server zu
schreiben, da der SimpleServer nicht in der Lage zu sein scheint mehrere
TCP-Packete pro Anfrage zu versenden. Wenn ich damit fertig bin werde
ich ihn unter der MIT-Lizenz auf GitHub zur Verfügung stellen.
Constantin schrieb:> Ich suche schon den ganzen Monat im Netz nach Beispielen wie so etwas> gemacht wird.
warum nimmst du nicht einfach den ausgereiften URadig-Webserver? Der ist
noch einigermaßen verständlich aufgebaut, so dass du noch relativ leicht
was verändern kannst.
Zum Schalten von Leds brauchst du keinen Websever. Du kannst die
Schaltbefehle direkt vom PC aus senden. Der uc muss die Befehle
empfangen, auswerten und Daten zurückgeben. Das UR-Programm kann das
alles. Man muss das Rad nicht noch einmal neu erfinden.
grundschüler schrieb:> Constantin schrieb:> Ich suche schon den ganzen Monat im Netz nach Beispielen wie so etwas> gemacht wird.>> warum nimmst du nicht einfach den ausgereiften URadig-Webserver? Der ist> noch einigermaßen verständlich aufgebaut, so dass du noch relativ leicht> was verändern kannst.> Zum Schalten von Leds brauchst du keinen Websever. Du kannst die> Schaltbefehle direkt vom PC aus senden. Der uc muss die Befehle> empfangen, auswerten und Daten zurückgeben. Das UR-Programm kann das> alles. Man muss das Rad nicht noch einmal neu erfinden.
Ja hab ich schon versucht bekomm das unter keil nicht zum laufen.
Du nimmst den lowlevel-Teil aus deinem simple-server, der ja schon
funktioniert. Dann bindest du die UR-Dateien ab stack.h eine nach der
anderen in deinen code ein. Geändert werden müssen die Variablentypen
auf 32bit und die Strukturen mit packed. progmem fällt weg. Orientieren
kannst du dich hier: Beitrag "Anpassung U.Radig-Webserver mit UDP für ARM CORTEX"
Das hab ich mir schon runtergeladen.
ich bekomm das unter Keil nicht Compilliert.
es hagelt Fehlermeldungen ist ja auch klar ist für ne andere
Architektur.
Zb. Das hier
strlcpy(internal_message, nPos+5,3);
Constantin schrieb:> Das hab ich mir schon runtergeladen.>> ich bekomm das unter Keil nicht Compilliert.>> es hagelt Fehlermeldungen ist ja auch klar ist für ne andere> Architektur.
Nö. Ist nicht klar.
So viele Architekturabhängige Dinge wie zb Portzugriffe sind da nicht
drinnen.
> strlcpy(internal_message, nPos+5,3);
Sicher, dass da str_l_cpy steht und nicht strncpy()?
Kann natürlich sein, dass er sich ein strlcpy gebaut hat, weil es sich
um irgendwelche Beschränkugen oder Erweiterungen handelt. Aber
eigentlich ist das recht eindeutig, dass er hier einen strncpy haben
will und das an dieser Stelle auch ein strncpy sein soll.
Im übrigen kann man gerne auch mal strlcpy in Google eingeben und sich
ansehen, wo die Funktion herkommt und was sie macht. Und .... das
gegebenenfalls (Gott bewahre) nachprogrammieren, wenn man denkt (und im
Code gesehen hat), dass es sich hier um eine vitale Ergänzung handelt,
die bewusst und absichtlich genommen wurde.
Aber: es ist natürlich einfacher, ganz simpel zu sagen "Es hagelt
Fehlermeldungen". Mit der Einstellung prophezeihe ich dir noch eine
große Zukunft in der Programmierung in der du mehr auf die Schnautze
fallen wirst als das du irgendwas weiter bringst.
Ich habe mir den Webserver von u radig versucht für keil zu übersetzen
aber ich bekomme das nicht zum laufen.
Hier zb. Komm ich nicht writer
PGM_P pointer = &Page1[(tcpentry[index].app_status-3)*100];
Constantin schrieb:> Hier zb. Komm ich nicht writer
an welcher Stelle des codes ist das? Du müsstest vorne - also mit
stach.h/c - anfangen. Läuft stack.h/c schon?
// PGM_P page_pointer; //Zeiger auf Speicherinhalt
uint32_t page_pointer; //Zeiger auf Speicherinhalt
PGM_P scheint was mit AVR-progmem zu tun zu haben. Das musst du dann
durch einen normalen Pointer ersetzen: uint32_t* - bin mir da aber nicht
ganz sicher, weil ich die Stelle im code nicht finde.
Progmem wird für ARM einfach wegdefiniert. Dann funktioniert das als
normaler Pointer:
#define PROGMEM
typedef char PROGMEM prog_char;
#define PGM_P const prog_char *
Wenn ich das richtig verstehe, hast du in ein leeres Projekt
Original-UR-AVR-Dateien geladen und wunderst dich, dass das nicht geht.
Deine main.c ist komplett leer. dass AVR-timer.c von Keil kompiliert
wird, kannst du nicht ernsthaft erwarten.
Ich habe in meinem AVR-Projekt mal <avr/pgmspace.h> herausgenommen:
1
#ifdef AVR
2
#include<avr/pgmspace.h>
3
#else
4
#define PROGMEM
5
typedefcharPROGMEMprog_char;
6
#define PGM_P const prog_char *
7
#define PSTR(s) ((const PROGMEM char *)(s))
8
#define pgm_read_byte *
9
#endif
Man bekommt dann zwangsläufig Fehlermeldungen, die aufgefangen werden
müssen. Bei meinem AVR-Projekt funktioniert das, wie oben dargestellt.
wenn du PGM_P so definiert hast, kann das eigentlich keine Fehlermeldung
mehr geben.
Allerdings verstehe ich die Systematik in deiner Programmentwicklung
nicht.
Das hab ich erstmal so eingebunden um zusehen was ich korrigieren muss.
ich dachte vielleicht gibs irgendwo ein lauffähiges Projekt wo mann
selbst einn wenig lernen kann
Ist die wahl jetzt endgültig auf den URadig-Webserver gefallen?
Oder ist irgendjemand an meinem Server interessiert?
Das ist doch mehr aufwand als ich dachte. Bisher habe ich ethernet
frames und arp implementiert. Fehlt nurnoch ip, icmp, udp, tcp, http und
ws.
Es ist bereits auf github:
https://github.com/Daniel-Abrecht/DPA-UCS
Constantin schrieb:> ich dachte vielleicht gibs irgendwo ein lauffähiges Projekt wo mann> selbst einn wenig lernen kann
Du hast doch ein lauffähiges Projekt simple server. Nimm alles raus
oberhalb von enc28j60. Du hast dann lauffähigen code der im Prinzip nur
2 Funktionen ausführen kann: mit enc_read_buf und enc_write_buf den
enc_buf beschreiben und auslesen. Das ist ohne große
Programmierkenntnisse machbar.
Dann bringst du den UR-Stack zum laufen. Das sind nur zwei Dateien,
stack.h und stach.c. Da nimmst du die beiden Dateien aus meinem Projekt,
in welchen die types bereits von AVR auf ARM geändert worden sind(andere
Länge von int).
Der gleiche Stack läuft bei mir mit coide, winavr und codered. Für Keil
können eigentlich nur marginale Änderungen erforderlich sein. Wenn der
Stack funktioniert - mit Dauerping testen - ist der Rest einfach.
grundschüler schrieb:> Constantin schrieb:> ich dachte vielleicht gibs irgendwo ein lauffähiges Projekt wo mann> selbst einn wenig lernen kann>> Du hast doch ein lauffähiges Projekt simple server. Nimm alles raus> oberhalb von enc28j60. Du hast dann lauffähigen code der im Prinzip nur> 2 Funktionen ausführen kann: mit enc_read_buf und enc_write_buf den> enc_buf beschreiben und auslesen. Das ist ohne große> Programmierkenntnisse machbar.>> Dann bringst du den UR-Stack zum laufen. Das sind nur zwei Dateien,> stack.h und stach.c. Da nimmst du die beiden Dateien aus meinem Projekt,
Wo finde ich dein projekt und welche version vom stack von u radig
Constantin schrieb:> Wo finde ich dein projekt
das ist die aktuelle Version. stack_c.h ist nicht selbsständig
lauffähig, weil ich nur hierachisch programmiere. Das wäre dann deine
Aufgabe, das mit entsprechenden #includes wieder als *.c-Datei lauffähig
zu bekommen, wenn du das willst.
Anpassen musst du enc_buffer_read/write und den PROGMEM-Kram.
Gibt es denn kein einfaches Beispiel (für einen STM32F103 mit ENC28J60
als Webserver) wo Bilder angezeigt werden und wo mann ein paar Ausgänge
schalten kann.
Constantin schrieb:> einfaches Beispiel
es gibt im Prinzip lwip, uip und UR.
Bei lwip habe ich aufgegeben und bin zu UR gewechselt. Das war dann im
Vergleich zu lwip sehr einfach.
Ich habe MDK-Beispiele uip für LPC1768. Für den STMF103 kannst du das
UR-Programm lauffähig bekommen - aber nur in coide.
Was hast du denn mit stack.h/c versucht? Was klappt nicht?
Bei keil uvision ist standardmässig c90 kompatiblität eingestellt,
während die meisten c codes c99 voraussetzen. Versuche mal unter den
target settings im reiter c/c++ die checkbox c99 zu aktivieren.
grundschüler schrieb:> Constantin schrieb:>> Fehlermeldung mit den>> Structs und Pointern>> Welche konkreten Fehlermeldungen?
Das Projekt von hier Beitrag "Re: Webpage Webserver"
zb bei httpd.c
PGM_P pointer = &Page1[(tcp_entry[index].app_status-3)*100];
httpd.c(90): error: #20: identifier "prog_char" is undefined
error: #20: identifier "Page1" is undefined
ist doch aber
#define PROGMEM typedef char PROGMEM prog_char
#define PGM_P const prog_char
//----------------------------------------------------------------------
------
//Dazustellende Webseite
PROGMEM char Page1[] = {
Constantin schrieb:> zb bei httpd.c
warum beschränkst du dich nicht zunächst einmal auf den stack?
erst wenn der mit Timern und allem drum und dran ordentlich läüft, macht
es Sinn, sich mit dem Rest zu befassen.
Constantin schrieb:> grundschüler schrieb:>> Constantin schrieb:>>> Fehlermeldung mit den>>> Structs und Pointern>>>> Welche konkreten Fehlermeldungen?>> Das Projekt von hier Beitrag "Re: Webpage Webserver">
Das ist nur die halbe Miete
Hier
Beitrag "Re: Webpage Webserver"
hat Grunsschüler das alles kompletter aufgeführt
> zb bei httpd.c> PGM_P pointer = &Page1[(tcp_entry[index].app_status-3)*100];>> httpd.c(90): error: #20: identifier "prog_char" is undefined
Logisch. prog_char ist kein C Basisdatentyp sondern eine AVR-spezifische
Sache vom gcc.
Sieh dir nochmal den 2.ten Link an. Was findet sich dort?
1
typedefcharPROGMEMprog_char;
Ein prog_char ist nichts anderes als ein gewöhnlicher char. Nur eben auf
dem AVR im Flash.
> error: #20: identifier "Page1" is undefined>> ist doch aber> #define PROGMEM typedef char PROGMEM prog_char
Nö.
Grundschüler hat da einen Zeilenumbruch drinnen!
Das sind 2 Zeilen!
1
#define PROGMEM
2
typedefcharPROGMEMprog_char
die eine sorgt per Preprozessor, dass alle Makros PROGMEM 'ins Leere
laufen'. Die andere definiert einen Alias für den Datentyp 'prog_char'.
PROGMEM und alles was damit zusammenhängt, hat damit zu tun, dass ein
AVR nicht üppig mit SRAM ausgestattet ist. Daher verschiebt man
konstante Daten in den Flash. Und um den adressieren zu können, benutzte
man diese Makros.
Für dich kannst du PROGMEM komplett streichen und anstelle eines PGM_P
benutzt du ganz einfach einen 'const char*'. Der Datentyp prog_char ist
für dich nichts anderes als ein char. Und alle prog_readxxxx Funktionen
brauchst du nicht.
ich habe mir mal die minimal Version von u.Radig das unter keil zum
laufen zu bekommen.
zB.
function "memcpy_P" declared implicitly
function "strcasestr" declared implicitly
ich wollte ja nur ein paar leds schalten vielleicht noch ein bild
anzeigen auf der Webseite.
Arbeitet denn niemand mit Keil stm32
Build target 'Multi Media Development Board V1.0'
compiling httpd.c...
..\USER\APP\httpd.c(13): warning: #2775-D: white space is required
between the macro name "pgm_read_byte" and its replacement text
..\USER\APP\webpage.h(474): error: #20: identifier "NULL" is undefined
..\USER\APP\httpd.c(125): warning: #223-D: function "usart_write"
declared implicitly
..\USER\APP\httpd.c(140): warning: #223-D: function "usart_write"
declared implicitly
..\USER\APP\httpd.c(173): warning: #223-D: function "strcasestr"
declared implicitly
..\USER\APP\httpd.c(176): warning: #223-D: function "usart_write"
declared implicitly
..\USER\APP\httpd.c(177): warning: #223-D: function "usart_write_str"
declared implicitly
..\USER\APP\httpd.c(200): warning: #223-D: function "strcasestr"
declared implicitly
..\USER\APP\httpd.c(201): error: #20: identifier "PORTA" is undefined
..\USER\APP\httpd.c(201): error: #20: identifier "PA0" is undefined
..\USER\APP\httpd.c(205): error: #20: identifier "PORTA" is undefined
..\USER\APP\httpd.c(205): error: #20: identifier "PA1" is undefined
..\USER\APP\httpd.c(209): error: #20: identifier "PORTA" is undefined
..\USER\APP\httpd.c(209): error: #20: identifier "PA2" is undefined
..\USER\APP\httpd.c(232): warning: #223-D: function "memcpy_P" declared
implicitly
..\USER\APP\httpd.c(242): warning: #223-D: function "memcpy_P" declared
implicitly
..\USER\APP\httpd.c(246): warning: #223-D: function "memcpy_P" declared
implicitly
..\USER\APP\httpd.c(263): error: #268: declaration may not appear after
executable statement in block
..\USER\APP\httpd.c(264): error: #268: declaration may not appear after
executable statement in block
..\USER\APP\httpd.c(265): error: #268: declaration may not appear after
executable statement in block
..\USER\APP\httpd.c(281): warning: #223-D: function "strncasecmp_P"
declared implicitly
..\USER\APP\httpd.c(286): warning: #223-D: function "itoa" declared
implicitly
..\USER\APP\httpd.c(288): warning: #223-D: function "strnlen" declared
implicitly
..\USER\APP\httpd.c(289): warning: #223-D: function "memmove" declared
implicitly
compiling cmd.c...
..\USER\APP\cmd.h(14): error: #5: cannot open source input file
"avr/io.h": No such file or directory
compiling base64.c...
..\USER\APP\base64.c(24): error: #18: expected a ")"
..\USER\APP\base64.c(26): error: #18: expected a ")"
..\USER\APP\base64.c(36): error: #18: expected a ")"
..\USER\APP\base64.c(37): error: #18: expected a ")"
..\USER\APP\base64.c(45): error: #18: expected a ")"
..\USER\APP\base64.c(46): error: #65: expected a ";"
compiling stack.c...
..\USER\APP\httpd.h(31): error: #20: identifier "PGM_P" is undefined
..\USER\APP\httpd.h(37): error: #20: identifier "PGM_P" is undefined
..\USER\APP\httpd.h(38): error: #20: identifier "PGM_P" is undefined
..\USER\NET\enc28j60.h(555): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(555): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(555): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(556): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(556): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(556): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(557): error: #20: identifier "u16" is undefined
..\USER\NET\enc28j60.h(557): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(558): error: #20: identifier "u16" is undefined
..\USER\NET\enc28j60.h(558): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(559): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(560): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(560): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(561): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(561): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(562): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(562): error: #20: identifier "u16" is undefined
..\USER\NET\enc28j60.h(563): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(564): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(565): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(566): error: #20: identifier "u16" is undefined
..\USER\NET\enc28j60.h(566): error: #20: identifier "u8" is undefined
..\USER\NET\enc28j60.h(567): error: #20: identifier "u16" is undefined
..\USER\NET\enc28j60.h(567): error: #20: identifier "u16" is undefined
..\USER\NET\enc28j60.h(567): error: #20: identifier "u8" is undefined
..\USER\APP\stack.c(40): warning: #223-D: function "timer_init"
declared implicitly
..\USER\APP\stack.c(43): error: #29: expected an expression
..\USER\APP\stack.c(43): error: #20: identifier "count" is undefined
compiling telnetd.c...
..\USER\APP\telnetd.c(25): warning: #223-D: function "usart_write"
declared implicitly
..\USER\APP\telnetd.c(30): warning: #223-D: function "memmove" declared
implicitly
..\USER\APP\telnetd.c(33): error: #20: identifier "usart_status" is
undefined
..\USER\APP\telnetd.c(42): error: #29: expected an expression
..\USER\APP\telnetd.c(42): error: #20: identifier "a" is undefined
..\USER\APP\telnetd.c(45): error: #20: identifier "USR" is undefined
..\USER\APP\telnetd.c(45): error: #20: identifier "UDRE" is undefined
..\USER\APP\telnetd.c(47): error: #20: identifier "UDR" is undefined
..\USER\APP\telnetd.c(58): error: #20: identifier
"rx_buffer_pointer_out" is undefined
..\USER\APP\telnetd.c(80): error: #20: identifier
"rx_buffer_pointer_in" is undefined
..\USER\APP\telnetd.c(88): error: #20: identifier "ETH_INT_DISABLE" is
undefined
..\USER\APP\telnetd.c(90): error: #268: declaration may not appear
after executable statement in block
..\USER\APP\telnetd.c(91): error: #20: identifier
"rx_buffer_pointer_out" is undefined
..\USER\APP\telnetd.c(97): error: #20: identifier "usart_rx_buffer" is
undefined
..\USER\APP\telnetd.c(97): error: #20: identifier "BUFFER_SIZE" is
undefined
..\USER\APP\telnetd.c(105): error: #20: identifier "ETH_INT_ENABLE" is
undefined
..\USER\APP\telnetd.c(116): error: #20: identifier "usart_status" is
undefined
Target not created
ich habe angefangen mit dem hier:
https://github.com/watterott/WebRadio
dort die eth.c und eth.h mit den dazugehörigem eth ordner
daraus ist zwar mitlerweile was ganz eigenes entstanden ..
aber zum kennenlernen war es ganz gut
... den UR stack kannte ich bis dahin nicht ^^
sonst wäre es sicher der gewesen.
das KEIL simple server beispiel ist wirklich nur da um auf eine TCP
verbindung mit einem GET auch nur eine fixe seite zu liefern.
diese seite darf dann nur 1460 bytes haben.
du musst erstmal damit anfangen wie ein server so eine verbindung
aufbaut...
er gut als erstes die index.html ab dort sind verwesie zu weiteren
dateien .
diese ruft er EXTRA ab ( HTML1.0/1.1)
also baut er neue TCP verbindungen auf um die daten abzurufen
was er fordert steht nach dem GET ...
index.html oder /
logo.gif ...
style.css ...
das musst du erstmal rausfiltern
damit du ihm das richtige sendest
und ab hier macht es sinn das simple server beispiel wegzuwerfen und
entweder was fertiges zu nutzen oder eben was eigenes
die fertigen lwIP , µIP ... sind eben genau deswegen so groß WEIL sie
mit den mehrfachen Verbindungen klarkommen und eben Daten sortieren.
und dazu auch größere Daten in kleinere Pakete zerlegen.
Wenn du größere in kleinere zerlegst kommt ein weiterer Punkt dazu:
datenverlust !!!
dann muss der stack dafür sorgen das ein verlorenes paket wiederholt
wird
... und ja deswegen sind auch die embedded stacks so groß ...
compiling base64.c...
..\USER\APP\base64.c(24): error: #18: expected a ")"
..\USER\APP\base64.c(26): error: #18: expected a ")"
..\USER\APP\base64.c(36): error: #18: expected a ")"
..\USER\APP\base64.c(37): error: #18: expected a ")"
..\USER\APP\base64.c(45): error: #18: expected a ")"
..\USER\APP\base64.c(46): error: #65: expected a ";"
..\USER\APP\httpd.c(281): warning: #223-D: function "strncasecmp_P"
declared implicitly
..\USER\APP\httpd.c(286): warning: #223-D: function "itoa" declared
implicitly
..\USER\APP\httpd.c(288): warning: #223-D: function "strnlen" declared
implicitly
..\USER\APP\httpd.c(289): warning: #223-D: function "memmove" declared
implicitly
compiling cmd.c...
..\USER\APP\cmd.h(14): error: #5: cannot open source input file
"avr/io.h": No such file or directory
SCHADE scheint niemand mit Keil zu arbeiten.
Den U.Radig webserver bekomm ich nicht Kompilliert.
Werd mir ein Board bestellen wo auch Beispiele drauf sind die lauffähig
sind.
Constantin schrieb:> Werd mir ein Board bestellen wo auch Beispiele drauf sind die lauffähig> sind.
Erst mal C lernen wäre besser.
Du kannst es drehen und wenden wie du willst. Du bist hier in einer
Domäne wo es einfach nicht mehr reicht, wenn man mit der Maus irgendwo
draufklicken kann. Wer auch immer dir erzählt hat, das wäre alles so
einfach, er hat gelogen. Es ist einfach, wenn man einen gewissen
Grundstock an Wissen und Können mitbringt. Nur fehlt dir der leider.
Kauf dir einen Raspberry Pi, installier dir einen Apache Web Server und
gut ists.
Karl Heinz schrieb:> Constantin schrieb:>>> Werd mir ein Board bestellen wo auch Beispiele drauf sind die lauffähig>> sind.>> Erst mal C lernen wäre besser.> Du kannst es drehen und wenden wie du willst. Du bist hier in einer> Domäne wo es einfach nicht mehr reicht, wenn man mit der Maus irgendwo> draufklicken kann. Wer auch immer dir erzählt hat, das wäre alles so> einfach, er hat gelogen. Es ist einfach, wenn man einen gewissen> Grundstock an Wissen und Können mitbringt. Nur fehlt dir der leider.>> Kauf dir einen Raspberry Pi, installier dir einen Apache Web Server und> gut ists.
DAS STIMMT SCHON,
aber wenn ich kein Lauffähiges Projekt hab.
die spiellerei mit dem AVR das läuft dann auch nicht mit n ARM.
Thread kann gelöscht werden, arbeitet ja niemand mit stm
ich fuddel mit AVR , STM und NXP cortexen rum
das geht auf allen wenn man es will
nur muss das vorher klar sein das es auf verschiedenen plattformen
laufen soll
und auch deine demoboards von chinesen nutzen oft nur uIP oder lwIP
portierungen
und die gibts ja zu hauf ...
denn andere freie stacks gibts nicht wirklich die weitreichend gepflegt
werden...
also such doch eine portierung für LwIP + STM + ENJ
da wirds sicher was geben
wenn du nur 6 LEDs schalten willst reicht auch dein simple server
beispiel aus ...
du musst nur dafür sorgen das deine webseite insgesamt nur max 1440
bytes groß ist
also keine bilder keine langen texte ...
einfach nur buttons + text
das schafft man in 1440 bytes schmerzfrei
Constantin schrieb:> Thread kann gelöscht werden, arbeitet ja niemand mit stm
Der STM ist nicht das Problem.
Du verkennst die Situation.
DU und dein fehlendes Wissen sind das Problem.
Um dir hier weiter zu helfen, müsste ich dich erst mal 2 Monate in die
Schulung nehmen um dich auf einen Stand zu bringen, dass du überhaupt
erst mal verstehst wovon hier geredet wird.
Nix für ungut. Auch wenn es schmerzt, irgendwann muss man dann auch mal
reinen Wein einschenken.