HC-05蓝牙实现安卓与Arduino通信时接收数据无法触发逻辑问题
HC-05与Arduino蓝牙通信异常排查
核心问题根因
当前btData赋值后失效、等值判断不触发、回显后紧跟空行的现象,由三个常见配置问题直接导致:
- 字符串携带不可见终止符:绝大多数安卓蓝牙终端发送指令时,会自动追加
\r(回车)、\n(换行)作为结束标记。现有代码用readString()读取时,会把这些不可见字符全部存入btData,实际变量值为"1\r\n"、"off\r\n",和代码内硬编码的"1"、"off"做等值判断时永远无法匹配,自然触发不了对应逻辑分支。 - 空读触发无意义空回显:
readString()在串口缓冲区读空后,会直接返回空字符串。代码未对读取到的内容做非空校验就直接回显,就会出现有效数据回显完成后,紧跟着一行空输出的现象。 - 读取超时与循环延时不匹配:默认
readString()无自定义超时参数,会固定阻塞等待1秒收尾,和loop内的100ms延时叠加,容易出现读取出错、数据粘包的问题。
可直接落地的修复方案
调整Arduino端代码逻辑,替换原有实现:
#include <SoftwareSerial.h> #define rxPin 10 #define txPin 11 SoftwareSerial btSerial(rxPin, txPin); String btData; void setup() { Serial.begin(9600); // 可选配置,用于硬串口调试时观测实际接收的字节内容 btSerial.begin(9600); btSerial.println("bluetooth available"); } void loop() { if (btSerial.available()) { // 以换行为终止符读取字符串,设置10ms超时避免长阻塞 btData = btSerial.readStringUntil('\n'); // 清除字符串首尾残留的空格、回车、换行、制表符等不可见字符 btData.trim(); // 空内容直接跳过,不触发回显 if (btData.length() > 0) { btSerial.println(btData); if (btData == "1") { btSerial.println("LED on Pin 13 is on"); } if (btData == "off") { btSerial.println("LED on Pin 13 is off"); } } } delay(10); // 缩短原有100ms的过长延时,适配蓝牙数据实时性 }
同步检查安卓蓝牙终端的发送设置:关闭“双重换行”、“多回车发送”等冗余选项,确保发送的终止符和代码读取逻辑匹配,避免多余字符进入串口缓冲区。
快速调试技巧
- 可临时将接收到的btData逐字符通过硬串口打印对应的ASCII值,直接观测实际接收内容中包含的不可见字符,无需猜测匹配规则。
- 测试时优先打印btData的长度值,确认发送"1"时btData长度为1而非3/4,即可判断字符清洗逻辑已生效。
内容的提问来源于stack exchange,提问作者JimmyBreuer
相关产品推荐
相关产品推荐

