ESP32 SerialBT蓝牙终端输入密码始终提示错误问题求助
解决ESP32蓝牙密码验证失败问题
问题根源
当通过蓝牙终端输入密码并按下回车时,终端通常会发送**换行符(\n)和回车符(\r)**的组合。你的代码中使用readStringUntil('\n')读取输入,会把回车符(\r)也包含在getinput中,导致实际接收的字符串是"test\r"或"test\r\n",和预设的"test"不匹配,因此持续提示密码错误。
解决方案
方案1:去除输入字符串首尾空白字符
在读取输入后,调用String类的trim()方法,自动去除首尾的换行、回车、空格等空白字符:
void loop() { if (SerialBT.available()) { getinput = SerialBT.readStringUntil('\n'); getinput.trim(); // 新增此行,去除首尾空白字符 Serial.print("Received: "); Serial.println(getinput); if (getinput == password) { SerialBT.println("Correct password, unlocking"); myservo.write(unlockPosition); } else { myservo.write(lockPosition); SerialBT.println("Wrong Password"); } } }
方案2:调试确认接收内容(可选)
如果想进一步排查问题,可以在串口打印中添加字符串长度信息,直观对比接收内容和预设密码的差异:
Serial.print("Received: "); Serial.println(getinput); Serial.print("Received length: "); Serial.println(getinput.length()); Serial.print("Password length: "); Serial.println(password.length());
比如如果接收长度是5,说明包含了一个多余的\r字符,可验证方案1的有效性。
方案3:读取固定长度字符(备选)
如果trim()方法仍有问题,可以直接读取固定长度的字符(你的密码是4位),并清空缓冲区剩余的换行/回车字符:
void loop() { if (SerialBT.available() >= 4) { // 确保缓冲区有足够字符 getinput = SerialBT.readString(4); // 清空缓冲区剩余的换行、回车等字符,避免影响下一次读取 while(SerialBT.available()) { SerialBT.read(); } Serial.print("Received: "); Serial.println(getinput); if (getinput == password) { SerialBT.println("Correct password, unlocking"); myservo.write(unlockPosition); } else { myservo.write(lockPosition); SerialBT.println("Wrong Password"); } } }
内容的提问来源于stack exchange,提问作者Luis Pereira
相关产品推荐
相关产品推荐

