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
相关产品推荐
相关产品推荐

