我正在处理涉及Arduino UNO卡和JAVA的项目。 Arduino UNO是客户端,JAVA是服务器。
问题是我的验证函数在错误时返回0两次,为什么会这样做?如果是,则返回1和0,这很奇怪。 我只想让它返回一次,而不是像这里的例子那样假错误
#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);
}
}
我已尝试从服务器发送(管理员; 12344)到arduino,这就是我得到的:
Connecting...
Connected to Server
Admin;12344
Admin
12344
1
0
答案 0 :(得分:0)
while (client.available())
不可靠。它可能会比您预期的更早终止,具体取决于设备的相对速度。很可能你在第一次尝试时得到部分数据,在第二次尝试得到另一批次(可能只有\ n)。而不是依赖于可用,使用标记来结束数据。
答案 1 :(得分:0)
问题在于发送的内容。如果你查看输出的十六进制值,你会注意到1和0之间有7个CRLF。其中一个属于1的println。接下来的6个是3 println的输出。什么被打印3次?一个CRLF,就是全部。由于你做三个输出的子串的方式:
Serial.println(readString);
Serial.println(firstText);
Serial.println(secondText);
将打印完全相同的CRLF及其各自的println CRLF。
所以你的答案是你在发送给Arduino的行的末尾发送一个CRLF。考虑一下Cem Kalyoncu关于如何正确处理读数的答案,也不要在认证线末端向Arduino发送CRLF,你很可能会很好。
我还建议您阅读为什么不在arduino中使用String
。如果你继续使用它,你会带来一个记忆和空间问题的世界。
答案 2 :(得分:-1)
而不是if((username[i] == firstText ) && (password[i] == secondText))
,请尝试使用if(( firstText.equals(username[i]) ) && ( secondText.equals(password[i]) ))
我认为==
不会比较字符串的值。