You need to enable JavaScript to run this app. HC-05蓝牙实现安卓与Arduino通信时接收数据无法触发逻辑问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 13:27:10