Arduino Mega与Nano搭载HC-05软串口通信故障排查
HC-05蓝牙串口通信故障排查(Arduino Nano→Mega)
硬件与配置信息
HC-05 AT命令配置
- 主模块(搭配Mega):
AT+ROLE=1 AT+CMODE=0 AT+ADDR=<从模块地址> AT+UART=38400,0,0 - 从模块(搭配Nano):
AT+ROLE=0 AT+UART=38400,0,0
接线方式
- Mega:软RX(数字引脚2)接HC-05的TX,软TX(数字引脚3)接HC-05的RX
- Nano:软RX(数字引脚2)接HC-05的TX,软TX(数字引脚3)接HC-05的RX
问题现象
- 两个HC-05模块同步以「每2秒闪烁2次」的频率闪烁,确认配对成功
- Nano端串口监视器输入整数后,无法打印输入值
- Mega端串口监视器无任何输出
- 尝试直接连接MCU TX到HC-05 TX,问题仍未解决
代码问题分析
Nano(发送端)代码问题
- 宏定义语法错误:
#define softtx3缺少赋值,正确写法应为#define softtx 3,该错误会导致SoftwareSerial初始化失败 - 打印逻辑缺失:
Serial.println()无参数,无法输出读取到的整数 - 数据传输截断:
BTSerial.write(data)仅发送单个字节,若整数范围超过0-255,高位数据会丢失
Mega(接收端)代码问题
- 数据读取逻辑不匹配:用
char data = BTSerial.read()读取单个字节,无法解析多字节整数或字符串格式的整数 - 未处理缓冲区残留:串口缓冲区的换行符等残留数据会干扰后续读取
修复后代码
Nano(发送端)修复代码
#include<SoftwareSerial.h> #define softrx 2 #define softtx 3 // 修正宏定义错误 SoftwareSerial BTSerial(softrx, softtx); void setup(){ BTSerial.begin(38400); Serial.begin(9600); } void loop(){ while(Serial.available()){ int data = Serial.parseInt(); // 避免parseInt默认返回0的误判,同时处理输入完成后的换行 if(data != 0 || Serial.peek() == '\n'){ BTSerial.println(data); // 以字符串格式发送整数,确保完整传输 Serial.println(data); // 打印输入值到本地串口监视器 } // 清除缓冲区剩余的换行符等冗余数据 while(Serial.available() > 0){ Serial.read(); } } }
Mega(接收端)修复代码
#include <SoftwareSerial.h> #define softrx 2 #define softtx 3 SoftwareSerial BTSerial(softrx, softtx); // RX | TX void setup() { BTSerial.begin(38400); Serial.begin(9600); } void loop() { if (BTSerial.available() > 0) { int receivedData = BTSerial.parseInt(); // 处理parseInt默认返回0的情况 if(receivedData != 0 || BTSerial.peek() == '\n'){ Serial.println(receivedData); // 打印接收到的整数 } // 清除缓冲区残留的换行符 while(BTSerial.available() > 0){ BTSerial.read(); } } }
额外排查点
- HC-05供电:必须使用3.3V供电,直接接5V会损坏模块或导致通信异常
- 接线交叉检查:确保MCU的TX接HC-05的RX,MCU的RX接HC-05的TX,不要接反
- 引脚兼容性:确认Nano和Mega的引脚2、3未被其他外设占用,SoftwareSerial对部分引脚有兼容性要求
- 串口波特率:本地串口监视器波特率需设置为9600,与代码中
Serial.begin(9600)一致;HC-05波特率保持38400不变
内容的提问来源于stack exchange,提问作者thetaisnew
相关产品推荐
相关产品推荐

