我想用我的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="";
}
}
}
}
}
答案 0 :(得分:0)
Arduino中read()
类的Stream
方法有一个超时(在我的Yun板上大约一秒钟)。每次调用read()
都会导致一秒钟的延迟,阻止其他活动。所以在你的情况下,我相信你有一个4秒的延迟来处理最后一次“l e f t”。
可以通过setTimeout()
更改超时,即请在您的计划中尝试client.setTimeout(200)
,看看它是否会更具响应性。