You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 14:30:39