Oh - ich glaube ich habe den Fehler gefunden: Der HTTP-Header, den ich benutzt habe, hat ein "Connection:close" nachgeschickt - vermutlich gab das Probleme mit dem manuellen Trennen der Verbindung im Programm...
Oh - ich glaube ich habe den Fehler gefunden: Der HTTP-Header, den ich benutzt habe, hat ein "Connection:close" nachgeschickt - vermutlich gab das Probleme mit dem manuellen Trennen der Verbindung im Programm...
Ja da die Kommandobefehle ja prüfen ob die Kommandos richtig übertragen werden kann sich das in die Quere kommen.
Kommt da nicht das richtige zurück gibts Fehlermeldungen.
Wie schon dabei steht, das ist der simpelst denkbare Webserver damit es ein schön übersichtliches Beispiel bleibt.
Wenn man den ganzen Kram den ein normaler Webserver sonst noch so kann braucht, muss man schon etwas mehr Aufwand treiben.
MfG,
SlyD
Hallo
Das macht echt Spass mit dem Loader und seinen abgedockten Terminals zu spielen.
Auf Basis des Webserverbeispiels eine LED-Ansteuerung mit dem Browser:
Die URL im Form-Tag muss man natürlich anpassen.Code:// LEDs mit dem Browser ansteuern mic 22.7.2012 #include "RP6M256Lib.h" char c, kommando=0; void send_html_page(void); int main(void) { initRP6M256(); writeString_P("\n\nsetLEDs() mit dem Browser 22.7.2012 mic\n\r"); // Make sure WLAN Module Packet size / buffer size and flush timer is OK enter_cmd_mode_WIFI(); issueCMD_WIFI("set comm size 1024","AOK"); issueCMD_WIFI("set comm time 10","AOK"); leave_cmd_mode_WIFI(); while(true) { if(getBufferLength_WIFI()) // Daten vom Browser empfangen? { c=readChar_WIFI(); writeChar(c); // ja, dann Daten zum seriellen Terminal senden if(c == '?') { kommando=1; setLEDs(0); } // und ab dem ? interpretieren if(kommando) switch(c) { case 'a': setLED1(1); break; case 'b': setLED2(1); break; case 'c': setLED3(1); break; case 'd': setLED4(1); break; } if(c == 13) // Datenende { if(kommando) kommando=0; else setLEDs(0); // LEDs aus, wenn kein ? gefunden send_html_page(); } } } return 0; } void send_html_page(void) { // Send HTTP Header: writeString_P_WIFI("HTTP/1.0 200 OK\r\n"); writeString_P_WIFI("Content-Type: text/html\r\n"); writeString_P_WIFI("\r\n"); // Send HTML Content: writeString_P_WIFI("<html><head><title>RP6-WIFI: Leds ansteuern</title></head><body>\n"); writeString_P_WIFI("setLeds():\n"); writeString_P_WIFI("<form action=\"http://169.254.77.3:2000\" method=\"get\">\n"); writeString_P_WIFI("<input type=\"radio\" name=\"SL4\" value=\"d\"> \n"); writeString_P_WIFI("<input type=\"radio\" name=\"SL3\" value=\"c\"> \n"); writeString_P_WIFI("<input type=\"radio\" name=\"SL2\" value=\"b\"> \n"); writeString_P_WIFI("<input type=\"radio\" name=\"SL1\" value=\"a\">\n"); writeString_P_WIFI("<br>\n"); writeString_P_WIFI("<input type=\"submit\" value=\"Setzen\">\n"); writeString_P_WIFI("<input type=\"reset\" name=\"Name\" value=\"reset\">\n"); writeString_P_WIFI("</form>\n"); writeString_P_WIFI("</body>\n"); writeString_P_WIFI("</html>\n"); // Wait a bit and then close connection: mSleep(50); // Depending on the content you may have to wait longer. enter_cmd_mode_WIFI(); // ??? Wie funktioniert das? writeCommand_WIFI("close\r"); leave_cmd_mode_WIFI(); }
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hey leute,
ich werf mal so zwischen durch ein, dass ichs auch endlich am Laufen habe
Die Einarbeitung ist doch etwas tricky, wenn man keinen RP6 hat, aber es ist eigentlich alles super erklärt nur schadet es nicht das RP6 Handbuch auch zu kennen.
ich hatte zuerst auch Probleme mit der WLAN-Verbindung, aber es lag an meinem Router. Hab das Modul jetzt wo anders getestet, da geht es sofort ohne Probleme. Super Arbeit von Arrex. Jetzt auf ans weiter testen.
Gruß
Elchi
Jo, Ichthyosaurier nun auch endlich ein vernünftiges WLAN-Terminal in labview, welches ich nun gerade versuche, zu verwenden und einzubauen.
Mal sehen...![]()
Hallo
Beim Kompilieren des SD-Card-Beispiel habe ich einige Hürden zu überwinden. Gegen " 'for' loop initial declaration used outside C99 mode" hilft ein "-std=c99" in den Flags des Kompilers im Makefile. Das war noch einfach. Aber das verstehe ich nicht:
Beides bezieht sich auf die Datei RP6M256Lib.c:Code:avr-gcc -std=c99 -mmcu=atmega2560 -Os -mno-interrupts -funsigned-char -funsigned-bitfields -Wall -Wstrict-prototypes -ggdb -c -DF_CPU=16000000UL -Wa,-acdhlmns=RP6M256Lib.lst RP6M256Lib.c -o RP6M256Lib.o RP6M256Lib.c:547: warning: declaration does not declare anything RP6M256Lib.c: In function 'delayCycles': RP6M256Lib.c:650: error: 'asm' undeclared (first use in this function) RP6M256Lib.c:650: error: (Each undeclared identifier is reported only once RP6M256Lib.c:650: error: for each function it appears in.) RP6M256Lib.c:650: error: expected ';' before 'volatile' make: *** [RP6M256Lib.o] Error 1
Code:/*****************************************************************************/ // Delays, Stopwatches and Beeper: // --------------------- // Internal status bits volatile union { uint8_t byte; struct { unsigned beep:1; unsigned unused:7; }; <-- Zeile 547 } controlStatus;Das #define für nop() findet sich in RP6M256.h in Zeile 276:Code:/** * Delay a number of instruction cycles. * No exact delay function! And interrupts can still occur and * add a lot of extra cycles. * This function only guarantees to delay for a MINIMAL number * of cycles! * * Example: * delayCycles(1000); // Delays for *about* 1000 instruction cycles */ void delayCycles(volatile uint16_t dly) { //volatile uint16_t delay2 = dly; //while(delay2--) nop(); while(dly--) nop(); <-- Zeile 650 }
(Zeilenangaben jeweils aus der Library der Testmodule)Code:// Assembly and system macros: #define nop(); {asm volatile("nop\n\t");} <-- Zeile 276 #define bl_reset(); cli();bl_start();
Irgendwelche Ideen?
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hallo mic,
gibt keine Probleme hier, der Compiler Aufruf ist aber auch deutlich anders... Du verwendest nicht die makefiles die dabei waren nehme ich an?
Wie sieht Dein Makefile denn aus?Compiling: ../../RP6Lib/RP6control_M256_WIFI/RP6M256Lib.c
avr-gcc -c -mmcu=atmega2560 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=../../RP6Lib/RP6control_M256_WIFI/RP6M256Lib.lst -I../../RP6Lib -I../../RP6Lib/RP6control_M256_WIFI -I../../RP6Lib/RP6common -I../../RP6Lib/RP6control_M256_WIFI/sdc -std=gnu99 -MD -MP -MF .dep/RP6M256Lib.o.d ../../RP6Lib/RP6control_M256_WIFI/RP6M256Lib.c -o ../../RP6Lib/RP6control_M256_WIFI/RP6M256Lib.o
Benutzt Du WinAVR oder was anderes?
Übrigens das nop(); wird auch an anderen Stellen in der Lib verwendet, also dürftest Du eigentlich wenn es denn Probleme macht gar kein Programm erfolgreich compilieren können.
> "-std=c99"
Nimm mal gnu99.
MfG,
SlyD
Hi Radbruch,
funzt dein Programm bei dir immer? Bei mir klappt es bis zur ersten Eingabe, ab der zweiten ist die Verbindung weg?!!?
Grüße
Habe da einen kleinen Fehler im Beispiel 12 entdeckt:
Wenn man cmd aktiviert hat, aber einen Bumper betätigt, wird zunächst kein Escape-Behave aktiviert. Dieser folgt dann aber prompt, wenn man den Command-Modus wieder deaktiviert...
Ist glaube ich nicht so gewollt, oder?
Grüße
Hallo
Das Beispiel für die SD-Card erwartet keine Parameter. Hast du die Text-Datei aus dem Beispielordner in das Root-Verzeichniss der SD-Card kopiert? SD-Card ist mit FAT32 formatiert?Bei mir klappt es bis zur ersten Eingabe, ab der zweiten ist die Verbindung weg?
Ein WIFI-Board braucht doch keine GUI, eine Browserschnittstelle ist viel knuffiger:Jetzt fehlt eigentlich nur noch die GUI und vielleicht ein etwas effizienteres Protokoll
Zwar noch etwas holperig und viel "zu Fuss" programmiert, weil ich mit HTML nicht wirklich geübt bin, aber immerhin zeigt es den Ansatz. Leider funktioniert es nicht mit meinem 9er IE, aber mit dem FF klappts wie erwartet. Es ist natürlich noch nicht perfekt.Code:// LEDs setzen und Daten der Browseranforderung anzeigen mic 28.7.2012 // https://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul?p=555651&viewfull=1#post555651 #include "RP6M256Lib.h" uint8_t c, header_html_request[20][100], hhr_zeile=0, hhr_zeile_max=0, hhr_pos=0, hhr_params; uint8_t leds_mask=0; void leds_setzen(void); void send_html_page(void); int main(void) { initRP6M256(); writeString_P("\n\rBrowserdaten anzeigen mic 28.7.2012\n\r"); // Make sure WLAN Module Packet size / buffer size and flush timer is OK enter_cmd_mode_WIFI(); issueCMD_WIFI("set comm size 1024","AOK"); issueCMD_WIFI("set comm time 10","AOK"); leave_cmd_mode_WIFI(); while(true) { if(getBufferLength_WIFI()) // Daten vom Browser empfangen? { c=readChar_WIFI(); // Zeichen einlesen... if(hhr_pos<98) header_html_request[hhr_zeile][hhr_pos++]=c; // ...und speichern if(c==13) // Zeilenende? { header_html_request[hhr_zeile][hhr_pos++]=0; // String Endekennung anfügen hhr_zeile++; // nächste Zeile einlesen hhr_pos=0; // Zeile startet bei Position null stopStopwatch1(); setStopwatch1(0); startStopwatch1(); // Timeout starten } } if(getStopwatch1() > 50) // Timeout beim Empfang bedeutet Headerende { header_html_request[hhr_zeile][hhr_pos++]=0; // String Endekennung anfügen hhr_zeile_max=hhr_zeile+1; // Anzahl der Zeilen speichern... leds_setzen(); send_html_page(); // ... und antworten hhr_zeile=0; // vorbereiten für nächsten Request-Header hhr_pos=0; hhr_zeile_max=0; stopStopwatch1(); // ab jetzt kein Timeout mehr überprüfen setStopwatch1(0); } } return 0; } void leds_setzen(void) { hhr_pos=0; do c=header_html_request[0][hhr_pos++]; while(c && (c != 'G')); if(c) // GET oder POST im Request gefunden? hhr_params=0; // GET else hhr_params=hhr_zeile_max-1; // kein GET hhr_pos=0; leds_mask=0; do { c=header_html_request[hhr_params][hhr_pos++]; if(c) switch(c) { case 'a': leds_mask |= 1; break; case 'b': leds_mask |= 2; break; case 'c': leds_mask |= 4; break; case 'd': leds_mask |= 8; break; } }while(c); setLEDs(leds_mask & 0Xf); } void send_html_page(void) { // Erhalt der Anforderung quittieren: writeString_P_WIFI("HTTP/1.1 200 OK\r\n"); writeString_P_WIFI("Content-type: text/html\r\n"); writeString_P_WIFI("\r\n"); stopStopwatch1(); setStopwatch1(0); startStopwatch1(); // Send HTML Content: writeString_P_WIFI("<html>\n<head>\n<title>RP6-WIFI: HTTP-Requestdaten anzeigen</title>\n</head>\n<body>\n"); writeString_P_WIFI("<h1>RP6-WIFI: LED setzen mit GET und POST</h1>\n"); writeString_P_WIFI("<form action=\"\" name\"get\" method=\"get\">\n"); writeString_P_WIFI("gSL4<input type=\"checkbox\" "); if(leds_mask & 8) writeString_P_WIFI("checked "); writeString_P_WIFI("name=\"gSL4\" value=\"d\"> \n"); writeString_P_WIFI("gSL3<input type=\"checkbox\" "); if(leds_mask & 4) writeString_P_WIFI("checked "); writeString_P_WIFI("name=\"gSL3\" value=\"c\"> \n"); writeString_P_WIFI("gSL2<input type=\"checkbox\" "); if(leds_mask & 2) writeString_P_WIFI("checked "); writeString_P_WIFI("name=\"gSL2\" value=\"b\"> \n"); writeString_P_WIFI("gSL1<input type=\"checkbox\" "); if(leds_mask & 1) writeString_P_WIFI("checked "); writeString_P_WIFI("name=\"gSL1\" value=\"a\"> \n"); writeString_P_WIFI("<input type=\"submit\" value=\"GET\">\n"); writeString_P_WIFI("</form>\n"); writeString_P_WIFI("<form action=\"\" name\"post\" method=\"post\">\n"); writeString_P_WIFI("pSL4<input type=\"checkbox\" "); if(leds_mask & 8) writeString_P_WIFI("checked "); writeString_P_WIFI("name=\"pSL4\" value=\"d\"> \n"); writeString_P_WIFI("pSL3<input type=\"checkbox\" "); if(leds_mask & 4) writeString_P_WIFI("checked "); writeString_P_WIFI("name=\"pSL3\" value=\"c\"> \n"); writeString_P_WIFI("pSL2<input type=\"checkbox\" "); if(leds_mask & 2) writeString_P_WIFI("checked "); writeString_P_WIFI("name=\"pSL2\" value=\"b\"> \n"); writeString_P_WIFI("pSL1<input type=\"checkbox\" "); if(leds_mask & 1) writeString_P_WIFI("checked "); writeString_P_WIFI("name=\"pSL1\" value=\"a\"> \n"); writeString_P_WIFI("<input type=\"submit\" value=\"POST\">\n"); writeString_P_WIFI("</form>\n"); for(hhr_zeile=0; hhr_zeile < hhr_zeile_max; hhr_zeile++) { hhr_pos=0; writeString_P_WIFI("Request Zeile "); writeInteger_WIFI(hhr_zeile, 10); writeString_P_WIFI(": "); do { c=header_html_request[hhr_zeile][hhr_pos++]; if(c) writeChar_WIFI(c); }while(c); writeString_P_WIFI("\n<br>\n"); } writeString_P_WIFI("\n<br>\nDie Parameter befinden sich in Zeile "); writeInteger_WIFI(hhr_params, 10); writeString_P_WIFI(":\n<br>\n"); hhr_pos=0; do { c=header_html_request[hhr_params][hhr_pos++]; if(c) writeChar_WIFI(c); }while(c); writeString_P_WIFI("<br>\nleds_mask ist "); writeInteger_WIFI(leds_mask, 2); writeString_P_WIFI("\n<br><br>\n<small>\n[Ladezeit der Seite: "); writeInteger_WIFI(getStopwatch1()+1, 10); writeString_P_WIFI("ms]\n<br><br>\nmic 29.7.2012\n</small>\n"); writeString_P_WIFI("</body>\n"); writeString_P_WIFI("</html>\n"); stopStopwatch1(); setStopwatch1(0); // Wait a bit and then close connection: mSleep(50); // Depending on the content you may have to wait longer. enter_cmd_mode_WIFI(); writeCommand_WIFI("close\r"); leave_cmd_mode_WIFI(); }
Das hier stört mich noch sehr dabei, weil es massig Speicherplatz verschwendet:
header_html_request[20][100]
Aber der m256 hat ja reichlich davon. ;)
Gruß
mic
Geändert von radbruch (29.07.2012 um 02:33 Uhr) Grund: optisches Update
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen