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

ESP32通过蓝牙接收字符串后对比判定不生效的问题如何解决?

问题原因

匹配失败是因为蓝牙串口接收到的字符串末尾大概率携带了**不可见的回车符\r**或者首尾空白字符:

  • 大部分蓝牙串口调试助手发送数据时默认换行符是\r\n(Windows标准换行),你用readStringUntil('\n')只会截断到\n之前,剩下的\r会留在text变量里,最终text实际值是"go\r",自然和"go"匹配失败
  • 硬件串口调试时你大概率是直接发不带\r的内容,或者调试工具默认换行是\n,所以不会触发问题

修复方案

方法1:接收后先修剪字符串首尾的空白/不可见字符

在读取到字符串之后、做匹配之前,调用trim()方法移除字符串首尾的所有空白字符(包括\r、空格、制表符等),修改后的loop代码如下:

void loop() {
  if (SerialBT.available() > 0) {
    text = SerialBT.readStringUntil('\n');
    text.trim(); // 新增这行,修剪首尾不可见字符
    Serial.println(text);
    if(text == "go") {
       Serial.println("Info");
    }
  }
  delay(20);
}

这个方法兼容性最好,不管发送端带的是哪种换行符、有没有多余首尾空格都能正常匹配。

方法2:直接匹配带\r的字符串

如果确定发送端固定用\r\n换行,也可以直接把匹配条件改成匹配带\r的内容:

if(text == "go\r") {
   Serial.println("Info");
}

这个方法只适合固定发送格式的场景,不推荐通用场景使用。

方法3:修改截断字符为\r

如果发送端换行符固定是\r\n,也可以把readStringUntil的截断参数改成\r,读完之后再把缓存里剩余的\n读走丢弃,避免下一次读取到空内容:

text = SerialBT.readStringUntil('\r');
if(SerialBT.available()) SerialBT.read(); // 丢弃末尾的\n

内容的提问来源于stack exchange,提问作者Skeletron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 11:45:06