Hi, mein Arduino mit Redfly Shield antwortet nach kurzer Zeit nicht mehr und hängt manchmal. Gibt es dafür einen Trick wie man das beheben kann? Ich habe das Gefühl, dass es erst nicht mehr antwortet, wenn man lange keine Anfrage mehr gesendet hat. Hauptsächlich besteht dieses Problem bei Infrastructur. Im Adhoc-Modus liegt es eher am PC denke ich, da ich beim neuverbinden mit dem PC wieder steuern kann. Lg ratsplayer
Arduino Redfly antwortet nach kurzer Zeit nicht mehr
Läuft ein Webserver auf dem Arduino und wie sieht der Sketch aus? Wichtig ist nur, dass man alle empfangenen Daten erst verarbeitet bzw. ausliest, bevor man neue Daten sendet. (Solange Daten im Eingangspuffer sind, kann man keine Befehle an das RedFly schicken.) Gruß Andreas
Hey,
vielen Dank für den netten Support!
ja es läuft ein Webserver-Sketch (das Original umgeschrieben von mir).
Das Problem liegt nicht daran, dass zu viele Daten ankommen. Ich kann also
Daten senden, die verarbeitet werden. Wenn Ich danach mehrere Befehle
schicke, werden alle abgearbeitet. Funktioniert zu 80% problemlos.
Wenn ich dann 5minuten nichts mache, ist der Server nicht mehr erreichbar.
Über adhoc kann ich dann einfach Verbindung trennen und wieder verbinden,
dann geht wieder alles.
Eigentlich möchte ich aber über Infrastructur verbinden.
Das zweite Problem besteht darin, dass viele Befehle nacheinander wunderbar
abgearbeitet werden, und dann auf einmal schafft er das nicht mehr und
verzögert, obwohl es sich um die gleichen Befehle handelt und die nicht
schneller versendet werden.
Hier mein Sketch:
/*
INCLUDES
*/
#include <RedFly.h>
/*
VARIABLEN
*/
byte ip[] = { 192,168, 1, 150 }; //ip from shield (server)
byte netmask[] = { 255,255,255, 0 }; //netmask
char http_buf[64]; //receive buffer
uint8_t http=0xFF; //socket handle
uint16_t http_len=0; //receive len
uint8_t ret;
uint8_t sock, buf[32];
uint16_t rd, len;
int x=0;
int y=0;
/*
FUNKTIONEN
*/
void debugout(char *s) { RedFly.disable(); Serial.print(s);
RedFly.enable(); }
void debugoutln(char *s){ RedFly.disable(); Serial.println(s);
RedFly.enable(); }
void verbinden()
{
ret = RedFly.init(230400, HIGH_POWER);
RedFly.scan();
ret = RedFly.join("PCFLY",IBSS_JOINER or IBSS_CREATOR, 1);
//ret = RedFly.join("TELEKOM DSL");
ret = RedFly.begin(ip, 0, netmask);
http = RedFly.socketListen(PROTO_TCP, 80);
}
void startseite()
{
RedFly.socketSend(sock, PSTR("HTTP/1.1 200 OK\r\nContent-Type:
text/html\r\n\r\n"), 44);
RedFly.socketSend(sock, PSTR("RC CAR by Ratsplayer! <br><br> <a
href='/gas'>Gas</a> <br><a href='/nogas'>Kein Gas</a> <br><a
href='/back'>Bremse</a> <br><a href='/noback'>Keine Bremse</a> <br>"), 55);
}
/*
SETUP
*/
void setup()
{
verbinden();
if(ret) debugoutln("Verbindungs Fehler");
pinMode(12, OUTPUT);
pinMode(10, OUTPUT);
pinMode(8, OUTPUT);
pinMode(6, OUTPUT);
}
/*
LOOP
*/
void loop()
{
int z=0;
x++;
if (x==10000)
{
x=0;
y++;
}
if (y==10)
{
y=0;
z=z+1;
Serial.print("Alles OK : ");
Serial.println(z);
}
if(http == 0xFF)
{
verbinden();
}
sock = 0xff;
rd = RedFly.socketRead(&sock, &len, 0, 0, buf, sizeof(buf));
if(sock == http)
{
if((rd != 0) && (rd != 0xffff))
{
if((http_len+rd) > sizeof(http_buf))
{
rd = sizeof(http_buf)-http_len;
}
memcpy(&http_buf[http_len], buf, rd);
http_len += rd;
}
if((rd == 0xffff) || (len == 0))
{
if(strncmp_P(http_buf, PSTR("GET / HTTP"), 10) == 0)
{
//startseite();
}
else if(strncmp_P(http_buf, PSTR("GET /gas HTTP"), 13) == 0)
{
digitalWrite(12, HIGH);
//tone(12,1500);
//startseite();
}
else if(strncmp_P(http_buf, PSTR("GET /nogas HTTP"), 15) == 0)
{
//noTone(12);
digitalWrite(12, LOW);
//startseite();
}
else if(strncmp_P(http_buf, PSTR("GET /back HTTP"), 14)
== 0)
{
//tone(12,1300);
digitalWrite(10, HIGH);
//startseite();
}
else if(strncmp_P(http_buf, PSTR("GET /noback HTTP"), 16)
== 0)
{
//noTone(12);
digitalWrite(10, LOW);
//startseite();
}
else if(strncmp_P(http_buf, PSTR("GET /left HTTP"), 14)
== 0)
{
//noTone(12);
digitalWrite(8, HIGH);
//startseite();
}
else if(strncmp_P(http_buf, PSTR("GET /noleft HTTP"), 16)
== 0)
{
//noTone(12);
digitalWrite(8, LOW);
//startseite();
}
else if(strncmp_P(http_buf, PSTR("GET /right HTTP"), 15)
== 0)
{
//noTone(12);
digitalWrite(6, HIGH);
//startseite();
}
else if(strncmp_P(http_buf, PSTR("GET /noright HTTP"),
17) == 0)
{
//noTone(12);
digitalWrite(6, LOW);
//startseite();
}
else
{
RedFly.socketSend(sock, PSTR("HTTP/1.1 404 Not Found\r\n\r\n"),
26);
}
http_buf[0] = 0;
http_len = 0;
RedFly.socketClose(sock);
http = RedFly.socketListen(PROTO_TCP, 80);
}
}
}
Dann am besten mal den Netzwerkverkehr mit Wireshark loggen und nachschauen ob die Verbindung zum Modul immer klappt oder ob keine Daten gesendet werden. Den Verbindungsaufbau (TCP: SYN ACK) macht das Modul selbstständig und schickt dann die Nutzdaten zum Arduino. Gruß Andreas


