我正在处理一个涉及Arduino UNO卡和JAVA的项目。Arduino UNO将是客户端,JAVA将是服务器。
问题是,当校验函数为false时,它会两次返回0,为什么它会这样做?如果为true,它会返回1和0,这很奇怪。我只想让它返回一次,而不是像这里的例子那样的false:
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x50, 0x35 };
IPAddress arduino(192,168,0,12);
IPAddress server(192,168,0,15);
EthernetClient client;
String username[] = {"Admin","Skut","Arbek","Kubda"};
String password[] = {"12344","stra","124ssgra","!#¤%"};
String readString;
void setup() {
Serial.begin(9600);
Ethernet.begin(mac,arduino);
Serial.println("Connecting...");
if (client.connect(server, 8888)){
Serial.println("Connected to Server");
}
else {
Serial.println("Connecting failed");
}
}
boolean verify(String firstText, String secondText){
for(int i = 0; i <= 3 ; i++){
if((username[i] == firstText ) && (password[i] == secondText)){
return true;
}
}
return false;
}
void clientRead() {
while (client.available()) {
//delay(10);
if (client.available() >0) {
char c = client.read();
readString += c;
}
}
}
void loop(){
if (client.available() > 0){
readString = "";
clientRead();
Serial.println(readString);
int n = readString.length();
int commaIndex = readString.indexOf(';');
int lastIndex = readString.lastIndexOf(n);
String firstText = readString.substring(0, commaIndex);
String secondText = readString.substring(commaIndex + 1 , lastIndex);
Serial.println(firstText);
Serial.println(secondText);
Serial.println(verify(firstText, secondText));
}
if (!client.connected()){
Serial.println("Server disconnected!");
client.stop();
client.flush();
while(true);
}
}
我已经尝试从服务器发送(Admin;12344)到arduino,这就是我得到的:
Connecting...
Connected to Server
Admin;12344
Admin
12344
1
0
while (client.available())
不可靠。根据设备的相对速度,它可能会比您预期的提前终止。很可能您在第一次尝试时得到了部分数据,在第二次尝试时又得到了另一批数据(可能只是\n)。使用标记结束数据,而不是依赖可用数据。
问题在于发送的内容。如果你查看输出的十六进制值,你会注意到1和0之间有7个CRLF。其中一个属于1的println。接下来的6正好是3 println的输出。什么正在打印3次?一个CRLF,仅此而已。由于您处理子字符串的方式,所有三个输出:
Serial.println(readString);
Serial.println(firstText);
Serial.println(secondText);
将与它们各自的打印ln的CRLF一起打印完全相同的CRLF。
所以你的答案是,你在发送到Arduino的线路末端发送了一个CRLF。考虑一下Cem Kalyoncu关于如何正确处理读取以及不要在验证行末尾向Arduino发送CRLF的回答,你很可能会没事的。
我还建议您阅读为什么不在arduino中使用String
。如果你继续使用它,这是一个内存和空间问题的世界。
尝试使用if(( firstText.equals(username[i]) ) && ( secondText.equals(password[i]) ))
而不是if((username[i] == firstText ) && (password[i] == secondText))
我认为==
不会比较字符串的值。