Forum: Mikrocontroller und Digitale Elektronik Webpage Webserver


von andreas (Gast)


Angehängte Dateien:

Lesenswert?

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

von grundschüler (Gast)


Lesenswert?

andreas schrieb:
> Ich wollte eigendlich nur 6 Led´s schalten.

das sollte hier gehen:
1
          cmd = analyse_get_url((char *) &(buf[dat_p + 5]));
2
            // for possible status codes see:
3
            
4
            if (cmd ==(u8)-1)
5
            {
6
               plen = fill_tcp_data_p(buf, 0, PSTR("HTTP/1.0 401 Unauthorized\r\nContent-Type: text/html\r\n\r\n<h1>401 Unauthorized</h1>"));
7
               goto SENDTCP;
8
            }
9
            if (cmd == 0)
10
            {
11
         GPIO_SetBits(GPIOF,GPIO_Pin_6);
12
         GPIO_SetBits(GPIOF,GPIO_Pin_7);
13
         GPIO_SetBits(GPIOF,GPIO_Pin_8);
14
         GPIO_SetBits(GPIOF,GPIO_Pin_9);
15
         GPIO_SetBits(GPIOF,GPIO_Pin_10);
16
               i = 0;
17
            }
18
            if (cmd == 1)
19
...

von Constantin (Gast)


Lesenswert?

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

von A. B. (funky)


Lesenswert?

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...

von Eric B. (beric)


Lesenswert?

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)

von BeastyK (Gast)


Lesenswert?

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

von andreas (Gast)


Angehängte Dateien:

Lesenswert?

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

von 0815 (Gast)


Lesenswert?

andreas schrieb:
> Aber ich kann keine LED ein oder aus schalten.

Dann zurück zu 1).

von andreas (Gast)


Angehängte Dateien:

Lesenswert?

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

von Constantin (Gast)


Lesenswert?

Wie gesagt ich kann die Buttons malen das wird alles richtig angezeigt.
Aber die auswertung welcher button angeklickt wurde da weiss ich nich 
weiter.

von Karl H. (kbuchegg)


Lesenswert?

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)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Sascha W. (sascha-w)


Lesenswert?

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>");
Ein Wunder das der Browser überhaupt was sinnvolles anzeigt bei dem 
Durcheinander an Tag's.

Sascha

von Constantin (Gast)


Lesenswert?

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

von r_u_d_i (Gast)


Lesenswert?

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=1

http://de.selfhtml.org/html/verweise/definieren.htm

jetzt aber los, bin schon auf deine webseite gespannt!

;-)

von Constantin (Gast)


Angehängte Dateien:

Lesenswert?

r_u_d_i schrieb:

> Na HTML und LINK ist dein Stichwort
> schauh dir das mal an:
> http://www.google.de/search?hl=de&source=hp&q=html...
>
> http://de.selfhtml.org/html/verweise/definieren.htm
>
> jetzt aber los, bin schon auf deine webseite gespannt!

Hallo,
ich hab mir das ganze Tutorial durcchgelesen ich kann die Text elemente 
auch anklicken,aber dann bekomme ich 401 Unauthorized.
ich weiss da nicht weiter.

von r_u_d_i (Gast)


Angehängte Dateien:

Lesenswert?

"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 :)

von Daniel A. (daniel-a)


Lesenswert?

Was steht denn in der Addresszeile?
1
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
u8 verify_password(char* str,int max)
4
{
5
   // the first characters of the received string are
6
   // a simple password/cookie:
7
   return (
8
     sizeof(password)-1 <= max &&
9
    !memcmp(password, str, sizeof(password)-1)
10
   );
11
}
12
13
u8 analyse_get_url(char* str)
14
{
15
  char* next;
16
17
  next = memchr(str,'/', 20);
18
  if(!verify_password(str,(size_t)next-(size_t)str))
19
    goto password_wrong;
20
21
  str = next + 1;
22
23
  unsigned command = 0;
24
  while( *str && *str != '/' ){
25
    if ( *str > '9' || *str < '0' )
26
      goto command_wrong;
27
    command = command * 10 + *str - '0';
28
    str++;
29
  }
30
31
  str++;
32
33
  if( command < 10 )
34
    return command;
35
  else goto command_wrong;
36
37
 password_wrong:
38
  return (u8)-1; // 255
39
 command_wrong:
40
  return (u8)-2; // 254
41
}

Und hier:
1
            if (strncmp("GET ", (char *) &(buf[dat_p]), 4) != 0)
2
            {
3
               // head, post and other methods:
4
               //
5
               // for possible status codes see:
6
               // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
7
               plen = fill_tcp_data_p(buf, 0, PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>200 OK</h1>"));
8
               goto SENDTCP;
9
            }
Sende besser den Richtigen Statuscode:
1
"HTTP/1.0 405 Method not allowed\r\nContent-Type: text/html\r\n\r\n<h1>405 Method not allowed</h1>"

von Constantin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
Ich habe das jetzt so das ich die LEDs ein und ausschalten abe rso 
richtig funktioniert das nicht .

von Daniel A. (daniel-a)


Lesenswert?

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:
1
  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.
1
  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.

von Constantin (Gast)


Angehängte Dateien:

Lesenswert?

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

von Daniel A. (daniel-a)


Lesenswert?

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:
1
  for(int i=0;i<3;i++){
2
    if(st[i]){
3
      plen = fill_tcp_data_p(buf, plen, "Led" );
4
      plen = fill_tcp_data_p(buf, plen, (cont char[]){'0'+i,0} );
5
      plen = fill_tcp_data_p(buf, plen, " On" );
6
    }else{
7
      plen = fill_tcp_data_p(buf, plen, "Led" );
8
      plen = fill_tcp_data_p(buf, plen, (cont char[]){'0'+i,0} );
9
      plen = fill_tcp_data_p(buf, plen, " Off" );
10
    }
11
  }

von Constantin (Gast)


Angehängte Dateien:

Lesenswert?

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

von Sascha W. (sascha-w)


Lesenswert?

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

von Mike A. (Gast)


Lesenswert?

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.

von Constantin (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Sascha W. (sascha-w)


Lesenswert?

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

von Daniel A. (daniel-a)


Lesenswert?

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.

von Constantin (Gast)


Lesenswert?

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

von Daniel A. (daniel-a)


Lesenswert?

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.

von Constantin (Gast)


Angehängte Dateien:

Lesenswert?

So siehst derzeit aus.
ich nehme an das der Buffer (buf) überläuft die grösse ist 1500.

von Eric B. (beric)


Lesenswert?

Constantin schrieb:
> Das hab ich den Tutorials nicht gefunden wie mann die HTML-Tags
> schliesst.

Dann mal wieder zurück zu 1) !!

von Constantin (Gast)


Lesenswert?

Eric B. schrieb:
> Dann mal wieder zurück zu 1) !!

Das hilft mir jetzt aber nicht so weiter warum der controller sich 
resetet.
mfg

von Sascha W. (sascha-w)


Lesenswert?

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

von Constantin (Gast)


Lesenswert?

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

von Daniel A. (daniel-a)


Lesenswert?

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.

von Constantin (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

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.

: Bearbeitet durch User
von Marc (Gast)


Lesenswert?

html, body und td müssen auch nicht geschlossen werden.

Die anderen Auszeichnungsfehler bleiben natürlich.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Marc (Gast)


Lesenswert?

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.

von Marc (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Marc schrieb:
> Der HTML-Standard. Und nicht erst seit HTML5.
>
> Such nach optional tags.

Danke.

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Marc (Gast)


Lesenswert?

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.

von Constantin (Gast)


Angehängte Dateien:

Lesenswert?

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

von Constantin (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
u16 print_webpage(u8* buf, u8 on_off)
2
{
3
  u16 plen;
4
  u8 i;
5
  // the url looks like this http://baseurl/password/command
6
7
8
  plen = fill_tcp_data(buf, plen, baseurl);
9
  plen = fill_tcp_data(buf, plen, password);
10
11
12
  plen = fill_tcp_data(buf, plen, baseurl);
13
  plen = fill_tcp_data(buf, plen, password);
14
15
  
16
  plen = fill_tcp_data_p(buf, 0, PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"));
17
  
18
  plen = fill_tcp_data(buf, plen, "<html>\r\n");
19
  plen = fill_tcp_data(buf, plen, "<head>\r\n");
20
  plen = fill_tcp_data(buf, plen, "  <title>STM32F103ZET6 HomeControl</title>");
21
  plen = fill_tcp_data(buf, plen, "</head>\r\n");
22
23
  plen = fill_tcp_data(buf, plen, "<body bgcolor='#A9ED61'>\r\n"); //Hintergrundfarbe
24
  plen = fill_tcp_data(buf, plen, "  <table border='1' width='500' cellpadding='5'>");
25
26
  plen = fill_tcp_data(buf, plen, "    <tr>\r\n");
27
  plen = fill_tcp_data(buf, plen, "      <td>LED 1</td>\r\n");
28
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 1, Spalte 2</td>\r\n");
29
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 1, Spalte 3</td>\r\n");
30
  if( st[0] == 0)
31
    plen = fill_tcp_data(buf, plen, "      <td>AUS</td>\r\n");
32
  else
33
    plen = fill_tcp_data(buf, plen, "      <td>EIN</td>\r\n");
34
  plen = fill_tcp_data(buf, plen, "    </tr>\r\n");
35
36
  plen = fill_tcp_data(buf, plen, "    <tr>\r\n");
37
  plen = fill_tcp_data(buf, plen, "      <td>LED 2</td>\r\n");
38
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 2, Spalte 2</td>\r\n");
39
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 2, Spalte 3</td>\r\n");
40
  if( st[1] == 2)
41
    plen = fill_tcp_data(buf, plen, "      <td>AUS</td>\r\n");
42
  else
43
    plen = fill_tcp_data(buf, plen, "      <td>EIN</td>\r\n");
44
  plen = fill_tcp_data(buf, plen, "    </tr>\r\n");
45
46
47
  plen = fill_tcp_data(buf, plen, "    <tr>\r\n");
48
  plen = fill_tcp_data(buf, plen, "      <td>LED 3</td>\r\n");
49
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 1, Spalte 2</td>\r\n");
50
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 3, Spalte 3</td>\r\n");
51
  if( st[2] == 4)
52
    plen = fill_tcp_data(buf, plen, "      <td>AUS</td>\r\n");
53
  else
54
    plen = fill_tcp_data(buf, plen, "      <td>EIN</td>\r\n");
55
  plen = fill_tcp_data(buf, plen, "    </tr>\r\n");
56
57
  plen = fill_tcp_data(buf, plen, "  </table>\r\n");
58
  plen = fill_tcp_data(buf, plen, "</body>\r\n");
59
  plen = fill_tcp_data(buf, plen, "</html>\r\n");       
60
61
  return plen;
62
}

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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

von Constantin (Gast)


Angehängte Dateien:

Lesenswert?

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

von Daniel A. (daniel-a)


Lesenswert?

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:
1
javascript:void(location.href =URL.createObjectURL(new Blob([(new Uint8Array(eval('['+((document.body.innerText||document.body.text||document.body.textContent).match(/{([^]*)}/)[1].replace(/\s/g,'').replace(/,$/,''))+']'))).buffer],{type:prompt("Content-Type")})))

von Constantin (Gast)


Lesenswert?

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\">

von Constantin (Gast)


Lesenswert?

So hier nochmal die kommplette Ausgabe,
meine Schalt elemente kann ich aucgh nich kommplett anzeigen.
1
u16 print_webpage(u8* buf, u8 on_off)
2
{
3
  u16 plen;
4
  u8 i;
5
  // the url looks like this http://baseurl/password/command
6
7
8
  plen = fill_tcp_data(buf, plen, baseurl);
9
  plen = fill_tcp_data(buf, plen, password);
10
11
12
  plen = fill_tcp_data(buf, plen, baseurl);
13
  plen = fill_tcp_data(buf, plen, password);
14
15
  
16
  plen = fill_tcp_data_p(buf, 0, PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"));
17
  
18
  plen = fill_tcp_data(buf, plen, "<html>\r\n");
19
  plen = fill_tcp_data(buf, plen, "<head>\r\n");
20
  plen = fill_tcp_data(buf, plen, "  <title>STM32F103ZET6 HomeControl</title>");
21
  plen = fill_tcp_data(buf, plen, "</head>\r\n");
22
23
  plen = fill_tcp_data(buf, plen, "<body bgcolor='#A9ED61'>\r\n"); //Hintergrundfarbe
24
  plen = fill_tcp_data(buf, plen, "  <table border='1' width='500' cellpadding='7'>");
25
26
  plen = fill_tcp_data(buf, plen, "    <tr>\r\n");
27
  plen = fill_tcp_data(buf, plen, "      <td>LED 1</td>\r\n");
28
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 1, Spalte 2</td>\r\n");
29
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 1, Spalte 3</td>\r\n");
30
    
31
  if( st[0] == 0)
32
  {
33
    plen = fill_tcp_data(buf, plen, "      <td>AUS</td>\r\n");
34
    plen = fill_tcp_data_p(buf, plen, PSTR("<td  bgcolor='#A9ED61'><form method=get><input type=submit name=1 value='einschalten'></form></td>\r\n"));  
35
  }
36
  else
37
  {
38
    plen = fill_tcp_data(buf, plen, "      <td>EIN</td>\r\n");
39
    plen = fill_tcp_data_p(buf, plen, PSTR("<td  bgcolor='#A9ED61'><form method=get><input type=submit name=0 value='ausschalten'></form></td>\r\n"));
40
  }
41
  plen = fill_tcp_data(buf, plen, "    </tr>\r\n");
42
43
44
  plen = fill_tcp_data(buf, plen, "    <tr>\r\n");
45
  plen = fill_tcp_data(buf, plen, "      <td>LED 2</td>\r\n");
46
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 2, Spalte 2</td>\r\n");
47
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 2, Spalte 3</td>\r\n");
48
49
50
  if( st[1] == 2)
51
   {
52
  plen = fill_tcp_data(buf, plen, "      <td>AUS</td>\r\n");
53
    plen = fill_tcp_data_p(buf, plen, PSTR("<td  bgcolor='#A9ED61'><form method=get><input type=submit name=3 value='einschalten'></form></td>\r\n"));
54
   }
55
  else
56
   {
57
    plen = fill_tcp_data(buf, plen, "      <td>EIN</td>\r\n");
58
    plen = fill_tcp_data_p(buf, plen, PSTR("<td  bgcolor='#A9ED61'><form method=get><input type=submit name=2 value='ausschalten'></form></td>\r\n"));
59
   }
60
  plen = fill_tcp_data(buf, plen, "    </tr>\r\n");
61
62
63
  plen = fill_tcp_data(buf, plen, "    <tr>\r\n");
64
  plen = fill_tcp_data(buf, plen, "      <td>LED 3</td>\r\n");
65
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 1, Spalte 2</td>\r\n");
66
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 3, Spalte 3</td>\r\n");
67
68
69
  if( st[2] == 4)
70
   {
71
  plen = fill_tcp_data(buf, plen, "      <td>AUS</td>\r\n");
72
    plen = fill_tcp_data_p(buf, plen, PSTR("<td  bgcolor='#A9ED61'><form method=get><input type=submit name=5 value='einschalten'></form></td>\r\n"));
73
   }
74
  else
75
   {
76
    plen = fill_tcp_data(buf, plen, "      <td>EIN</td>\r\n");
77
    plen = fill_tcp_data_p(buf, plen, PSTR("<td  bgcolor='#A9ED61'><form method=get><input type=submit name=4 value='ausschalten'></form></td>\r\n"));
78
   }  
79
  
80
  plen = fill_tcp_data(buf, plen, "    </tr>\r\n");
81
82
83
84
  plen = fill_tcp_data(buf, plen, "    <tr>\r\n");
85
  plen = fill_tcp_data(buf, plen, "      <td>LED 4</td>\r\n");
86
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 1, Spalte 2</td>\r\n");
87
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 3, Spalte 3</td>\r\n");
88
89
90
  if( st[3] == 6)
91
   {
92
  plen = fill_tcp_data(buf, plen, "      <td>AUS</td>\r\n");
93
    plen = fill_tcp_data_p(buf, plen, PSTR("<td  bgcolor='#A9ED61'><form method=get><input type=submit name=7 value='einschalten'></form></td>\r\n"));
94
   }
95
  else
96
   {
97
    plen = fill_tcp_data(buf, plen, "      <td>EIN</td>\r\n");
98
    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"));
99
   }
100
101
  plen = fill_tcp_data(buf, plen, "    </tr>\r\n");
102
103
104
  plen = fill_tcp_data(buf, plen, "    <tr>\r\n");
105
  plen = fill_tcp_data(buf, plen, "      <td>LED 5</td>\r\n");
106
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 1, Spalte 2</td>\r\n");
107
  plen = fill_tcp_data(buf, plen, "      <td>Zeile 3, Spalte 3</td>\r\n");
108
109
110
  if( st[4] == 8)
111
   {
112
  plen = fill_tcp_data(buf, plen, "      <td>AUS</td>\r\n");
113
    plen = fill_tcp_data_p(buf, plen, PSTR("<td  bgcolor='#A9ED61'><form method=get><input type=submit name=9 value='einschalten'></form></td>\r\n"));
114
   }
115
  else
116
   {
117
    plen = fill_tcp_data(buf, plen, "      <td>EIN</td>\r\n");
118
    plen = fill_tcp_data_p(buf, plen, PSTR("<td  bgcolor='#A9ED61'><form method=get><input type=submit name=8 value='ausschalten'></form></td>\r\n"));
119
   }  
120
  
121
  plen = fill_tcp_data(buf, plen, "    </tr>\r\n");
122
123
//Ab hier muss Ausgeblendet werden damit die Seite überhaupt angezeigt wird
124
 /*
125
  if( st[5] == 9)
126
   {
127
  plen = fill_tcp_data(buf, plen, "      <td>AUS</td>\r\n");
128
    plen = fill_tcp_data_p(buf, plen, PSTR("<td  bgcolor='#A9ED61'><form method=get><input type=submit name=9 value='einschalten'></form></td>\r\n"));
129
   }
130
  else
131
   {
132
    plen = fill_tcp_data(buf, plen, "      <td>EIN</td>\r\n");
133
    plen = fill_tcp_data_p(buf, plen, PSTR("<td  bgcolor='#A9ED61'><form method=get><input type=submit name=8 value='ausschalten'></form></td>\r\n"));
134
   }  
135
  
136
  plen = fill_tcp_data(buf, plen, "    </tr>\r\n");
137
*/
138
139
  plen = fill_tcp_data(buf, plen, "</table>\r\n");
140
  plen = fill_tcp_data(buf, plen, "</body>\r\n");
141
  plen = fill_tcp_data(buf, plen, "</html>\r\n");       
142
143
144
// Picture anzeigen
145
/*
146
  plen = fill_tcp_data_p(buf, plen,"HTTP/1.0 200 OK\r\nContent-Type: image/gif\r\nPragma: no-cache\r\n\r\n");
147
148
plen = fill_tcp_data_p(buf, plen," <img src=\"&st_logo_gif\" width=\"86\" height=\"65\">");
149
*
150
151
152
  return plen;
153
}

von Sascha W. (sascha-w)


Lesenswert?

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

von Constantin (Gast)


Lesenswert?

Die Webseite wird ja auch nich richtig angezeigt.
Wenn ich das Ausgeblendete wieder aktiv mache wird die Webseite nicht 
angezeigt.

von Sascha W. (sascha-w)


Lesenswert?

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

von Constantin (Gast)


Lesenswert?

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.

von Sascha W. (sascha-w)


Lesenswert?

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

von Daniel A. (daniel-a)


Lesenswert?

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.
1
unsigned  int fill_tcp_data_p(unsigned char* buf, unsigned  int pos,const unsigned char* progmem_s)
2
{
3
   while ( pgm_read_byte(progmem_s) )
4
// ...
5
}
6
7
unsigned  int fill_tcp_data(unsigned char* buf, unsigned  int pos,const char* s)
8
{
9
   while (*s)
10
// ...
11
}

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...

von Constantin (Gast)


Lesenswert?

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.

von Constantin (Gast)


Angehängte Dateien:

Lesenswert?

Kann mir einer von ihnen Weiterhelfen warum ich nich mehr in der 
webseite anzeigen kann.

von Sascha W. (sascha-w)


Lesenswert?

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

: Bearbeitet durch User
von Constantin (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
    <img src="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
1
  Browser                                             Server
2
************                                       ************
3
4
  "GET"    --------------------------------------->
5
                                              Was will er von mir?
6
                                              Hat er nicht näher gesagt
7
                                              Also kriegt er einfach mal
8
                                              die HTML Hauptseite       
9
                                             +-----------------------------+
10
                                             | HTTP/1.0 200 OK             |
11
                                             | Content-Type: text/html     |
12
                                             |                             |
13
                                             |                             |
14
                                             | <html>                      |
15
                                             |  <body>                     |
16
                                             |    <img src="hugo.gif">     |
17
                                             |  </body>                    |
18
       <------------------------------------ | </html>                     |
19
                                             +-----------------------------+
20
21
   Grummel, grummel, verarbeiten, analysieren
22
   Aha! Ich brauch noch ein Bild, und zwar das
23
   Bild 'hugo.gif'
24
25
   "GET hugo.gif" --------------------------------->
26
                                              Was will er von mir?
27
                                              Ahja. Er will eine Datei namens
28
                                              "hugo.gif"
29
30
                                             +------------------------------+
31
                                             | HTTP/1.0 200 OK              |
32
                                             | Content-Type: image/gif      |
33
                                             |                              |
34
                                             |                              |
35
                                             | Bilddaten in Form der Bytes  |
36
        <----------------------------------- | die das Bild ausmachen       |
37
                                             +------------------------------+
38
39
   Einsammel, Einsammel
40
   Hmm, Jetzt ist alles da. Das HTML ist vollständig,
41
   das Bild ist auch da. Also: Anzeigen
42
43
          |
44
          |
45
          +-----------------+
46
                            |
47
                            v
48
49
                 Benutzer der vor dem Monitor sitzt:
50
                  "Schick, eine Webseite mit einem Bild drinnen!"

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
1
u16 print_webpage_PICTURE(u8* buf, u8 on_off)
2
{
3
    int plen;
4
  //plen = fill_tcp_data(buf, plen, "<img src="html-seminar.jpg" />\r\n");
5
6
7
  plen = fill_tcp_data(buf, plen, baseurl);
8
  plen = fill_tcp_data(buf, plen, password);
9
  plen = fill_tcp_data(buf, 0, PSTR("HTTP/1.0 200 OK\r\nContent-Type: image/gif\r\n\r\n"));
10
11
  plen = fill_tcp_data(buf, plen," <img src=\"st_logo_gif\" width=\"88\" height=\"65\">");
12
13
....
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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Daniel A. (daniel-a)


Angehängte Dateien:

Lesenswert?

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.

von grundschüler (Gast)


Lesenswert?

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.

von Constantin (Gast)


Lesenswert?

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.

von grundschüler (Gast)


Lesenswert?

1
#if use_net
2
3
#include "wconfig_network.h"
4
#include "C:\zuc\enc38j60\encspi.h"
5
#include "C:\zuc\enc38j60\enc28j60.h"
6
#include "C:\zuc\enc38j60\enc28j60_c.h"
7
8
#include <C:\zuc\net\stack.h>
9
#include <C:\zuc\net\stack_c.h>
10
#include "C:\zuc\net\dnsc.h"
11
#include "C:\zuc\net\dnsc_c.h"
12
//#include "udp.h"
13
#include "C:\zuc\net\ntp.h"
14
#include "C:\zuc\net\ntpc.h"
15
#include "C:\zuc\menke_web\base64.h"
16
#include "C:\zuc\menke_web\base64_c.h"
17
#include <C:\zuc\menke_web\httpd.h>
18
#include "C:\zuc\menke_web\webpage.h"
19
#include <C:\zuc\menke_web\httpd_c.h>
20
#endif

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"

von Constantin (Gast)


Lesenswert?

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);

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Constantin (Gast)


Lesenswert?

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];

von grundschüler (Gast)


Lesenswert?

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.

von grundschüler (Gast)


Lesenswert?

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 *

von Constantin (Gast)


Angehängte Dateien:

Lesenswert?

grundschüler schrieb:
> 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 *

so hab ichs gemacht aber trotzdem Fehler

von grundschüler (Gast)


Lesenswert?

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
typedef char PROGMEM prog_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.

von Constantin (Gast)


Lesenswert?

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

von Daniel A. (daniel-a)


Lesenswert?

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

von grundschüler (Gast)


Lesenswert?

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.

von Constantin (Gast)


Lesenswert?

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

von grundschüler (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Constantin (Gast)


Lesenswert?

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.

von grundschüler (Gast)


Lesenswert?

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?

von Constantin (Gast)


Lesenswert?

Ich bekomme das unter Keil nicht lauffähig bekomm Fehlermeldung mit den 
Structs und Pointern.

von grundschüler (Gast)


Lesenswert?

Constantin schrieb:
> Fehlermeldung mit den
> Structs und Pointern

Welche konkreten Fehlermeldungen?

von Daniel A. (daniel-a)


Lesenswert?

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.

von Constantin (Gast)


Lesenswert?

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[] = {

von grundschüler (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
typedef char PROGMEM prog_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
typedef char PROGMEM prog_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.

von Constantin (Gast)


Angehängte Dateien:

Lesenswert?

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

von grundschüler (Gast)


Lesenswert?

> ..\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

Porta kennt er nicht => char PORTA,PINA;
#define A0 0....

> ..\USER\APP\cmd.h(14): error:  #5: cannot open source input file
> "avr/io.h": No such file or directory
kennt er nicht, braucht er nicht


> ..\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
=> #define PGM_P  char



> ..\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

=>
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t

von web (Gast)


Lesenswert?

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ß ...

von Constantin (Gast)


Lesenswert?

1
void decode_base64 (unsigned char *str1,unsigned char *str2)
2
{
3
  unsigned char *strp;
4
  
5
  strp = str2;
6
  
7
  while (*str1 != 0)
8
  {
9
    *str2++= (*str1 & 0b11111100)>>2;
10
    
11
    *str2 = (((*str1++)&0b00000011)<<4); 
12
    if (*str1==0)
13
    {
14
      str2++;
15
      *str2++= 0;
16
      *str2++= 0;
17
      break;
18
    }
19
    else
20
    {
21
      *str2++ += ((*str1 & 0b11110000)>>4);
22
      *str2 = (((*str1++)&0b00001111)<<2);
23
      if (*str1==0)
24
      {
25
        str2++;
26
        *str2++ = 0;
27
      }
28
      else
29
      {
30
        *str2++  += ((*str1 & 0b11000000)>>6);
31
        *str2++= *str1++ & 0b00111111;
32
      }
33
    }
34
  }
35
  *str2 = 0;
36
  while(*strp)
37
  {
38
      *strp = ENCODE_BYTE(*strp);
39
      strp++;
40
  }
41
}
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.

: Bearbeitet durch User
von Daniel A. (daniel-a)


Lesenswert?

Ersetze    mit
0b11111100 0xFC
0b00000011 0x03
0b11110000 0xF0
0b00001111 0x0F
0b11000000 0xC0
0b00111111 0x3F

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Constantin (Gast)


Lesenswert?

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

von web (Gast)


Lesenswert?

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

von web (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
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.