布尔值返回两次有问题(Arduino)
Trouble with boolean value returning twice (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))
我认为==
不会比较字符串的值。
- 在钻石问题的求解中,为什么要虚拟地继承两次grand-parent类
- 两次商店有什么
- 为什么当我在同一内存中各有两个指针时,我必须调用"delete"两次?
- C OOP,读取文件的问题,EOF使用了两次,排行榜
- 两次删除链表有什么区别?
- 有什么方法可以通过删除表达式安全地处理两次释放内存?
- 矩阵移位两次时出现问题
- C++将节点添加到链表的开头一次后失败.其他方法也有问题
- 有没有办法将 int 赋入具有递归函数的字符串中,而无需将数字反转两次
- 指针和类有问题。两个相同的类,其中一个有效,一个无效
- 为什么这条线路运行了两次,而且有异常行为
- 关于我的解密程序,有两个问题,C++有问题
- 不知道出了什么问题 - 两次程序隔离错误
- 复制构造函数——用相同的变量按值调用函数两次会导致问题
- 布尔值返回两次有问题(Arduino)
- C++两次传递函数指针导致问题
- Printf由于某种原因打印两次,cout似乎没问题
- 在使用cin时,是否有必要将一个变量存储两次
- 使用字符,我发现的唯一解决方案是static_cast两次。有没有办法解决这个问题?
- Makefile - section执行两次的问题