Arduino使用SoftwareSerial经HM-11蓝牙回写文本被截断问题求助
问题根因
你遇到的截断不是C/C++语法问题,是两个底层限制叠加导致的:
- HM-11作为BLE模块,默认单包有效载荷最大为20字节,模块自带的串口发送缓存仅64~128字节,一次性发送长字符串时缓存溢出,后续内容直接被丢弃
- 如果你用
SoftwareSerial模拟串口驱动HM-11,软串口默认发送缓存仅64字节,超过的内容也会直接溢出
解决方案
方案1:自动分包发送(无需改配置/拆代码,优先推荐)
不需要手动拆分字符串,写个循环自动分批发送即可,适配BLE分包传输的特性:
if(strcmp(command,"help")==0){ const char* help_text = F("============== RGBCube Bluetooth Help ==============\n" "Commands: \n" " mode:# select mode to operate in \n" " help pull up help screen (this) \n" " Mode 4 only: \n" " reset resets cube to black \n" " pt:x,y,z=r,g,b sets led at (x,y,z) to rgb \n" " set:r,g,b;r,g,b... sets entire cube to the \n" " specified colour \n" " 64 colours long. Faster \n" " than 64 pt calls \n"); // 串口输出保持不变 Serial.print(help_text); // 蓝牙自动分包发送 int str_len = strlen_P(help_text); for(int i=0; i<str_len; i+=20) { int send_len = min(20, str_len - i); BTSerial.write(help_text + i, send_len); delay(10); // 留时间给HM11腾空缓存,可根据实际情况下调到5ms } }
方案2:加大软串口缓存(如果用SoftwareSerial驱动HM11)
在引入SoftwareSerial.h之前定义宏,扩大软串口的收发缓存:
// 放在#include <SoftwareSerial.h> 之前 #define SERIAL_TX_BUFFER_SIZE 256 #define SERIAL_RX_BUFFER_SIZE 256 #include <SoftwareSerial.h>
该方案可以让软串口一次性装下你的完整帮助文本,配合10ms左右的发送后延时即可正常输出。
方案3:调整HM11配置提升传输上限
可以通过AT指令修改HM11的参数,提升单次传输上限:
- 用
AT+BAUD8指令把HM11波特率从默认9600改成115200,提升传输速度 - 用
AT+MTU247指令把BLE MTU改成最大247字节,单包最多可发244字节有效载荷
修改后配合分包逻辑,长文本传输速度会明显提升。
后续长文本接收注意事项
你后续要做手机向Arduino发长数据的功能,也需要遵循BLE分包逻辑,单次最多收20字节,用缓存把多包内容拼接成完整指令,不要尝试一次性接收完整长数据。
内容的提问来源于stack exchange,提问作者Collin
相关产品推荐
相关产品推荐

