布尔值返回两次有问题(Arduino)



我正在处理一个涉及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))

我认为==不会比较字符串的值。

最新更新