Arduino WiFi - 客户端读取速度非常慢

时间:2014-03-28 13:47:33

标签: arduino client wifi

我想用我的Arduino UNO& amp; Wifi盾牌。我写了一个Java程序,它将字符串(例如:left,mid等等)发送到我的Arduino(通过我的WLAN网络)。在我的Arduino程序中,我用client.read()读取了字符。

现在我的问题是:当我向arduino发送一些字符串时(例如:4次"left")比它工作正常,但是当我想要向右发送其他4个字符串之后,首先它保持在向右转之前向左走约4次(有时更多)。同样的事情发生在上下......

我真的不知道为什么,连接稳定,服务器控制程序正在使用Arduino的以太网屏蔽。

这是我的代码:

#include <SPI.h>
#include <WiFi.h>
#include <Servo.h>

char ssid[] = "yourNetwork"; // SSID des Netzwerkes
char pass[] = "secretPassword"; // Passwort des Netzwerkes
int keyIndex = 0; // Netzwerk Key-Index (nur bei WEP erforderlich)

int status = WL_IDLE_STATUS;
WiFiServer server(80);

// Servo dekl.
Servo myservo1;  
Servo myservo2;  

// Achsenstand init
int iXAchse=90;
int iYAchse=90;

// Einlese-String dekl.
String readString; 

void setup() {
    Serial.begin(9600); // Seriell start

    // Überprüft ob Wifi Shield angeschlossen ist
    if (WiFi.status() == WL_NO_SHIELD) {
        Serial.println("Kein WLAN Shield verbunden!");
        while(true); // Dauer-Stop Schleife
    }

    // Verbindungsaufbau mit Netzwerk
    while ( status != WL_CONNECTED) {
        Serial.print("Verbindungsaufbau mit Netzwerk: ");
        Serial.println(ssid); // Gibt SSID des Netzwerkes aus

        // Mit WPA/WPA2 Netzwerk verbinden
        status = WiFi.begin(ssid, pass);
        // Wenn keine Verbindung - Warte 10 Sekunden
        delay(10000);
    }
    server.begin(); // Server startet

    // Nachdem WIFI seine Verbindung hergestellt hat, stelle noch Servos ein
    myservo1.write(iXAchse); // weiter oben auf 90 gesetzt
    myservo2.write(iYAchse); // weiter oben auf 90 gesetzt

    myservo1.attach(9); // Pin 9 - X Achse
    myservo2.attach(8); // Pin 8 - Y Achse
}


void loop() {
    WiFiClient client = server.available(); // listen for incoming clients

    if (client) { // Client verfügbar ? 
        while (client.connected()) { // Solange Client verfügbar
            if (client.available()) { // Wenn Client Daten schickt

                char c = client.read(); 

                if (readString.length() < 100) { 
                    readString += c;
                } 

                if (c == '\n')  {

                    Serial.println(readString);  

                    //Servo1 Bewegung
                    client.println("links");
                    client.println("mitte");
                    client.println("rechts"); 

                    //Servo2 Bewegung
                    client.println("oben");
                    client.println("mid"); 
                    client.println("unten"); 

                    //stopt client
                    client.stop();

                    ///////////////////// Steuern von den Arduino pin
                    if(readString.indexOf("rechts") >0) {
                        iXAchse+=8;
                        myservo1.write(iXAchse);
                    }
                    if (readString.indexOf("mitte") >0) {
                        myservo1.write(90);
                        iXAchse=90;
                    }
                    if(readString.indexOf("links") >0) {
                        iXAchse-=8;
                        myservo1.write(iXAchse); 
                    }
                    if(readString.indexOf("oben") >0) {
                        iYAchse+=8;
                        myservo2.write(iYAchse);
                    }
                    if(readString.indexOf("mid") >0) { 
                        myservo2.write(90);
                        iYAchse=90;
                    }
                    if(readString.indexOf("unten") >0) {
                        iYAchse-=8;
                        myservo2.write(iYAchse);
                    }         
                    readString="";
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

Arduino中read()类的Stream方法有一个超时(在我的Yun板上大约一秒钟)。每次调用read()都会导致一秒钟的延迟,阻止其他活动。所以在你的情况下,我相信你有一个4秒的延迟来处理最后一次“l e f t”。

可以通过setTimeout()更改超时,即请在您的计划中尝试client.setTimeout(200),看看它是否会更具响应性。