先说结论
蓝牙透传就是让蓝牙模块当"无线串口线"用——你往TX/RX引脚丢什么数据,它就原封不动地传给另一端,不需要懂蓝牙协议,5分钟就能跑通。
一、透传到底是什么?
透传 = 透明传输,就是数据从A点进去,原样从B点出来,蓝牙层完全不处理你的数据。
对比一下就清楚了:
有线上:PC(USB) ────(线)──── 单片机
物理层传输
蓝牙透传:PC(USB) ──(蓝牙无线)── 蓝牙模块 ──(串口线)── 单片机
无线透传 有线串口
简单理解:蓝牙模块就是一条无线串口线,你原来怎么用有线串口的,现在就怎么用蓝牙。
二、三种常见透传实现方式
方案一:模块自带AT指令(最简单)
以HC-05为例,这是最经典的透传模块,配对后直接透传,不需要写代码:
// AT指令配置(通过串口发送给HC-05)
AT+NAME=BLE_UART // 设置蓝牙名称
AT+BAUD=115200 // 设置波特率(要和单片机一致!)
AT+PSWD=123456 // 配对密码
AT+ROLE=0 // 0=从机,1=主机(传感器一般用从机)
配置好后,手机连上HC-05,往蓝牙发数据,单片机串口就能收到,反过来也一样。
注意:HC-05是蓝牙2.1,功耗较高,但价格便宜、兼容性好,不追求低功耗的场景用HC-05完全够。
方案二:BLE串口服务(Nordic NUS)
如果你用的是BLE4.0以上模块(如CC2541、nRF52832、ESP32-C3),蓝牙端要走GATT服务,最通用的就是Nordic的UART Service(NUS):
| 参数 | 值 |
|---|---|
| 服务UUID | 6E400001-B5A3-F393-E0A9-E50E24DCCA9E |
| TX特征(通知) | 6E400002-B5A3...(模块→手机方向) |
| RX特征(写入) | 6E400003-B5A3...(手机→模块方向) |
手机端用nRF Connect APP就能连接BLE模块、发现这个服务,然后读写特征值收发数据。
代码示例(nRF52832上的Nordic NUS):
// BLE收到手机发来的数据,透传到单片机串口
void nus_data_handler(uint8_t *data, uint16_t len) {
uart_send(data, len); // 透传到串口TX引脚
}
// 单片机串口收到数据,发送到手机
void send_to_phone(uint8_t *data, uint16_t len) {
ble_nus_send(notify_handle, data, len); // BLE通知手机
}
方案三:自定义透传协议
如果你的数据需要校验、分包、加帧头,用这个结构最稳:
// 自定义数据包结构
typedef struct {
uint8_t header; // 帧头 0xAA(固定)
uint8_t len; // 数据长度
uint8_t data[256]; // 有效载荷
uint8_t checksum; // 校验和(header^len^data累加)
uint8_t tail; // 帧尾 0x55(固定)
} packet_t;
// 发送
void transmit_packet(uint8_t *data, uint16_t len) {
packet_t pkt;
pkt.header = 0xAA;
pkt.len = len;
memcpy(pkt.data, data, len);
pkt.checksum = calc_checksum(data, len);
pkt.tail = 0x55;
uart_send((uint8_t*)&pkt, sizeof(pkt));
}
建议:项目里尽量加上帧头帧尾和校验和,调试时能快速定位丢包问题。
三、常用透传模块横向对比
| 模块型号 | 芯片方案 | 蓝牙版本 | 透传方式 | 适用场景 |
|---|---|---|---|---|
| HC-05 | CSR BC417 | BT2.1+EDR | AT指令 | 经典场景,不要求低功耗 |
| HC-06 | CSR BC417 | BT2.1+EDR | 从机AT | 只做从机,更便宜 |
| JDY-31 | CC2541 | BLE4.0 | 串口透传 | 低功耗,性价比高 |
| BLK-MD-BK | CC2541 | BLE4.0 | 串口透传 | 稳定,兼容性好 |
| DSD TECH SH-A8 | CC2640 | BLE4.2 | 串口透传 | 低功耗升级方案 |
| HM-10 | CC2541 | BLE4.0 | 串口透传 | 经典模块,资料多 |
| nRF52832模块 | nRF52832 | BLE5.0 | NUS服务 | 高端场景,稳定性要求高 |
| ESP32-C3 | ESP32-C3 | BLE5.0 | 串口透传 | WiFi+BLE兼顾,低成本 |
四、硬件接线:就4根线
蓝牙模块 单片机(STM32/51/Arduino等)
────────────────────────────────────────────────
TXD ────────► RXD(模块发→单片机收)
RXD ◄─────── TXD(单片机发→模块收)
VCC ──────── 3.3V 或 5V(看模块手册)
GND ──────── GND(必须共地!)
STATE ──────── 状态指示灯(可选,不接也行)
KEY ──────── AT模式触发(HC-05才需要)
电平匹配注意:如果你的单片机是5V(比如标准Arduino),而蓝牙模块是3.3V(如ESP32-C3),中间要加电平转换:
5V单片机TX ──► TXS0108E电平转换 ──► 3.3V模块RX
五、配置步骤
HC-05配置流程(带AT模式)
1. 进入AT模式:按住模块上的KEY引脚,再上电,LED慢闪表示进入AT模式
2. 发送AT指令(115200波特率,8N1):
AT+NAME=MyDevice // 设备名称
AT+BAUD=115200 // 波特率
AT+PSWD=123456 // 配对密码
AT+ROLE=0 // 从机模式
AT+CMODE=0 // 指定蓝牙地址连接
3. 手机连接:下载"蓝牙串口助手"APP,搜索设备、配对、连接
4. 开始透传:连接成功后,发什么收什么
BLE模块配置(以JDY-31为例)
1. 手机端:下载nRF Connect,扫描"JY"开头的设备
2. 连接后:找到"Unknown Service",里面有两个特征值
3. 收发数据:
- 往TX Characteristic写数据 → 单片机串口收到
- 订阅RX Characteristic通知 → 手机收到单片机发来的数据
六、三大经典应用场景
场景1:单片机无线调试
电脑(串口助手) ──► USB转TTL ──► 蓝牙模块 ──► 手机/另一台电脑
↑
无线查看日志,不用守着设备
场景2:传感器数据无线上报
温湿度传感器 ──► MCU ──► BLE透传模块 ──► 手机APP/网关 ──► 云端
BLE低功耗特性特别适合这类场景,用CR2032电池能用1-2年。
场景3:手机APP控制设备
手机APP ──► BLE ──► 蓝牙模块 ──► MCU ──► 继电器/电机/灯
七、数据传输优化
坑1:丢包
原因:数据发太快,单片机处理不过来。
解法:
// 加个缓冲区分包发送
#define BUF_SIZE 512
uint8_t tx_buf[BUF_SIZE];
uint16_t tx_len = 0;
void tx_push(uint8_t *data, uint16_t len) {
if (tx_len + len > BUF_SIZE) {
ble_send(tx_buf, tx_len); // 缓冲区满了就发
tx_len = 0;
}
memcpy(tx_buf + tx_len, data, len);
tx_len += len;
}
// 定时清空缓冲区(50ms调用一次)
void tx_flush() {
if (tx_len > 0) {
ble_send(tx_buf, tx_len);
tx_len = 0;
}
}
坑2:延迟高
解法:
- 降低蓝牙连接间隔(Connection Interval),从100ms降到7.5ms
- 减少每次发送的数据量
坑3:容易断开
原因和对策:
- 距离太远 → BLE室内一般10米内,超过就换增益天线模块
- 电磁干扰 → 远离电机、开关电源,模块天线不要紧贴金属
- 发射功率低 → 选PA(功放)增强型模块
八、常见问题Q&A
Q1:BLE和蓝牙2.1透传哪个好?
看场景。BLE功耗极低(μA级待机),蓝牙2.1功耗高(mA级)。但BLE需要手机APP支持(nRF Connect等),蓝牙2.1所有手机都能连。不追求低功耗就选HC-05,简单省事。
Q2:波特率设置多少合适?
大多数BLE透传模块最高支持115200bps,HC-05可以到1382400bps。如果是高速数据(视频、音频流),不建议用透传,考虑蓝牙音频方案。
Q3:可以同时连接多个从机吗?
BLE中心设备(主机)可以连接多个从机,但BLE透传模块通常是点对点的。一对多需要用nRF52840这类带多连接的方案。
Q4:透传能传多远?
无遮挡室内5-15米,空旷地带30-50米。选配SMA天线的模块可以到50-100米。穿墙效果差,BLE信号对墙衰减大。
Q5:数据安全性怎么样?
透传是明文传输!敏感数据记得在应用层做加密(AES等)。BLE4.2以上支持Secure Connections配对,安全性好很多。
总结
蓝牙透传就是无线串口线,选对模块、调对波特率、加校验位,基本就稳了。
新手入门的最佳路径:
1. 买一个JDY-31(CC2541)+ 一个USB转TTL
2. 照着上面的接线图接好
3. 手机装nRF Connect,连上模块试试
4. 没问题了再接单片机开发
搞通了这一套,你后面做蓝牙项目就心里有数了。
相关阅读:
- [蓝牙模块选型指南](./06-蓝牙模块选型指南.md)
- [蓝牙芯片对比:CC2541 vs nRF52832 vs ESP32-C3](./23-蓝牙芯片对比.md)