ESP32(BLE)向Arduino外接HM-10传数据失败及接收程序编写咨询
解决HM-10接收ESP32 BLE数据的问题
首先,恭喜你的ESP32已经成功和HM-10建立BLE连接了!HM-10本质是串口转BLE模块,所以Arduino只需要通过串口和HM-10通信,就能获取ESP32发来的数据。下面是完整的接收方案:
一、硬件连接(Arduino ↔ HM-10)
HM-10是3.3V电平模块,千万不要接5V电源,否则会烧坏!接线如下:
- HM-10 VCC → Arduino 3.3V
- HM-10 GND → Arduino GND
- HM-10 TX → Arduino RX(注意交叉连接,模块TX发数据给Arduino的RX)
- HM-10 RX → Arduino TX(如果用硬件串口,建议串一个1k电阻分压,避免5V电平烧坏HM-10的3.3V RX引脚)
如果你的Arduino硬件串口被USB调试占用,可以用SoftwareSerial模拟串口连接HM-10。
二、Arduino端接收代码
方案1:使用硬件串口(适合无需USB调试的场景)
void setup() { // 初始化和HM-10连接的串口,波特率要和HM-10一致(默认是9600) Serial.begin(9600); // 若需要同时用USB串口调试,打开对应硬件串口(比如Mega的Serial1) // Serial1.begin(9600); // 假设HM-10接Serial1 } void loop() { // 读取HM-10发来的串口数据 if (Serial.available() > 0) { // 读取到换行符为止,也可以用readString()读取所有缓存数据 String receivedData = Serial.readStringUntil('\n'); // 用USB串口打印到电脑调试(如果用Serial1连接HM-10,就换成Serial.println) SerialUSB.println("收到ESP32的数据:" + receivedData); } delay(10); }
方案2:使用SoftwareSerial(适合保留USB串口调试的场景)
#include <SoftwareSerial.h> // 定义模拟串口引脚,这里用D2和D3举例 SoftwareSerial hm10Serial(2, 3); // 参数:Arduino的RX引脚, Arduino的TX引脚 void setup() { // USB串口用于调试输出 Serial.begin(115200); // 初始化和HM-10连接的模拟串口,波特率匹配HM-10默认值9600 hm10Serial.begin(9600); Serial.println("HM-10接收程序启动"); } void loop() { // 读取HM-10转发的BLE数据 if (hm10Serial.available() > 0) { String data = hm10Serial.readStringUntil('\n'); Serial.println("收到ESP32的数据:" + data); } delay(10); }
三、关键注意事项
- 波特率匹配:HM-10默认波特率是9600,如果你之前用AT指令修改过,要确保Arduino代码里的波特率和HM-10一致。可以通过给HM-10发送
AT+BAUD?指令查询当前波特率。 - ESP32发送端优化:你的ESP32代码里发送的是
HELLO WORLD,可以尝试在末尾加换行符\n,这样Arduino端用readStringUntil('\n')能更准确地读取完整数据:String newValue = "HELLO WORLD\n"; pRemoteCharacteristic->writeValue(newValue.c_str(), newValue.length()); - Characteristic属性确认:HM-10的
FFE1Characteristic默认支持WRITE属性,ESP32的writeValue调用才能生效,这一点你的代码已经匹配,不用额外修改。
这样设置后,Arduino就能正常接收ESP32通过BLE发来的数据了!
内容的提问来源于stack exchange,提问作者Sarojini
相关产品推荐
相关产品推荐

