51单片机蓝牙通信实战:HC-05/06与手机APP的数据透传与调试
1. 蓝牙模块选型与硬件连接在51单片机项目中实现蓝牙通信HC-05和HC-06是最常用的两种模块。实测下来HC-05更适合需要主从切换的场景而HC-06作为从机模块价格更实惠。我经手过的智能花盆、仓库温湿度监测等项目都用过这两种模块稳定性都没问题。硬件接线记住一个口诀交叉连接共地优先。具体来说蓝牙模块的TX接单片机的RXP3.0蓝牙模块的RX接单片机的TXP3.1两边的GND引脚必须相连VCC接5V或3.3V取决于模块版本新版HC-05通常支持3.3V有个容易翻车的地方早期买的HC-05模块可能默认波特率是38400而51单片机常用9600。这时候需要先用USB转TTL工具通过AT命令修改蓝牙模块波特率。具体操作是给模块KEY引脚接高电平上电进入AT模式后发送ATUART9600,0,02. 串口通信基础配置51单片机的串口配置就像给快递站设置收发规则。TMOD寄存器相当于选择快递车类型模式2是自动重装定时器TH1/TL1是规定发车频率波特率SCON则是设置收发规则。这里给出个万能配置模板适合大多数51芯片void UartInit() { TMOD | 0x20; // 定时器1模式2 TH1 0xFD; // 9600波特率11.0592MHz TL1 TH1; PCON 0x7F; // 波特率不倍增 SCON 0x50; // 模式1允许接收 ES 1; // 开串口中断 EA 1; // 开总中断 TR1 1; // 启动定时器 }遇到过最头疼的问题是通信乱码通常有三个排查方向检查晶振频率是否匹配代码设置11.0592MHz最准用逻辑分析仪抓波形看实际波特率确认双方停止位、校验位设置一致3. 数据格式转换与传输直接发送浮点数就像把大象装进快递箱——必须拆解成零件。这里分享三种实用方法3.1 联合体转换法union { float f_val; unsigned char bytes[4]; } float_union; float_union.f_val 3.14159; for(int i0; i4; i) { SBUF float_union.bytes[i]; while(!TI); TI0; }3.2 sprintf格式化char buffer[20]; float temp 25.6; sprintf(buffer, T:%.1fC, temp); SendString(buffer);3.3 结构体打包#pragma pack(1) typedef struct { uint16_t id; float voltage; uint8_t status; } SensorData; #pragma pack() SensorData data; SendString((char*)data, sizeof(data));手机端接收时要注意字节序问题。Android的BluetoothSerial库默认是大端模式而51单片机是小端。建议在数据包头增加0xAA55作为帧起始标志。4. 手机APP调试技巧推荐几款实测好用的蓝牙调试APPSerial Bluetooth Terminal免费支持图表显示BLE Scanner专业版可保存历史数据Arduino Bluetooth Controller自带控件面板在APP里设置接收回调时建议添加超时处理。比如每50ms检查一次缓冲区遇到换行符或达到最大长度就触发解析。这样可以避免数据粘包问题。数据可视化有个小技巧在发送数据时添加前缀标识符。例如printf($TEMP%.1f#, temperature);然后在APP端用正则表达式提取Pattern pattern Pattern.compile(\\$TEMP(\\d\\.\\d)#);调试时如果发现数据丢包可以尝试降低波特率到4800测试在关键位置添加LED状态指示使用软件流控制发送XON/XOFF最后提醒一个隐蔽的坑某些手机厂商会限制后台蓝牙扫描。需要在APP设置里勾选保持唤醒选项否则屏幕熄灭后可能收不到数据。