ESP32+SX1276 LoRa接收数据上传Firebase报错求解
LoRa接收器上传数据到Firebase编译失败、上传异常修复
问题背景
实现目标为制作可将LoRa消息上传至Firebase的LoRa接收器,目前已完成LoRa收发端通信调试,但始终无法完成Firebase数据上传。编译阶段提示缺少主表达式(primary expression),参考公开示例调整后问题未解决,且参考示例未使用Arduino IDE推荐写法。
使用硬件清单:
- ESP32开发板
- RFM95 SX1276 LoRa模块

原始问题代码
#include <SPI.h> #include <LoRa.h> #include <WiFi.h> #include <WiFiClient.h> const char* ssid = "*******"; const char* password = "******"; #include <Firebase.h> #define FIREBASE_HOST "************************" #define FIREBASE_AUTH "************" #define ss 5 #define rst 14 #define dio0 2 #define BAND 915E6 // Initialize variables to get and save LoRa data int rssi; String loRaMessage; String temperature; String humidity; String readingID; String suhu; String lembab; FirebaseData data; String processor(const String& var){ //Serial.println(var); if(var == "TEMPERATURE"){ return temperature; } else if(var == "HUMIDITY"){ return humidity; } else if (var == "RRSI") { return String(rssi); } return String(); } void startLoRA(){ int counter; LoRa.setPins(ss, rst, dio0); while (!LoRa.begin(BAND) && counter < 10) { Serial.print("."); counter++; delay(500); } if (counter == 10) { Serial.println("Starting LoRa failed!"); } Serial.println("LoRa Initialization OK!"); } void setup(){ Serial.begin(115200); Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH); //WIFI WiFi.begin(ssid, password); Serial.print("Connecting to WiFi"); while (WiFi.status() !=WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println("Connected to the Network"); Serial.print("IP Address: "); Serial.println(WiFi.localIP()); startLoRA(); } void loop(){ int packetSize = LoRa.parsePacket(); if (packetSize){ String LoRaData = LoRa.readString(); while (LoRa.available()){ Serial.print((char)LoRa.read()); } // Get RSSI rssi = LoRa.packetRssi(); Serial.print("With RSSI "); Serial.println(rssi); int pos1 = LoRaData.indexOf('/'); int pos2 = LoRaData.indexOf('&'); readingID = LoRaData.substring(0,pos1); temperature = LoRaData.substring(pos1 + 1, pos2); humidity = LoRaData.substring(pos2 + 1, LoRaData.length()); if (readingID =="001"){ suhu= temperature; Serial.print(F("Suhu :")); Serial.println(suhu); Serial.println(F("C")); lembab= humidity; Serial.print(F("Kelembaban : ")); Serial.print(lembab); Serial.println("%"); String fbsuhu = String (suhu) + String("C"); String fblembab = String (lembab) + String("%"); Firebase.setString (FirebaseData, "Suhu :", fbsuhu); Firebase.setString (FirebaseData, "Lembab :", fblembab); } } }
错误点定位
- 直接触发编译报错的核心问题:定义的Firebase数据对象名为
data(FirebaseData data;),但调用Firebase.setString时传入的是类型名FirebaseData而非实例化的变量名,编译器无法识别就会抛出「缺少主表达式」的错误。 - 初始化顺序错误:先调用
Firebase.begin()再连接WiFi,Firebase依赖网络连接,初始化顺序颠倒会导致后续根本连不上Firebase服务。 - 未初始化变量:
startLoRA函数内的counter变量定义后没有赋初始值,默认值为内存随机数,会直接导致LoRa初始化重试判断逻辑失效。 - LoRa数据读取逻辑冲突:先调用
LoRa.readString()读完了整个数据包缓冲区,后面又循环调用LoRa.read()读空缓冲区,既会导致串口打印乱码/无输出,还可能引发RSSI取值异常。 - 拼写错误:
processor函数中判断RSSI的字符串写为"RRSI",多写了一个R,会导致对应变量替换逻辑失效。 - Firebase路径不规范:上传数据用的节点路径带空格、冒号等特殊字符,容易触发Firebase权限校验、路径匹配异常,建议使用纯英文、无特殊符号的路径。
修复后可运行代码
#include <SPI.h> #include <LoRa.h> #include <WiFi.h> #include <WiFiClient.h> #include <Firebase.h> // 配置参数 const char* ssid = "*******"; const char* password = "******"; #define FIREBASE_HOST "************************" #define FIREBASE_AUTH "************" #define ss 5 #define rst 14 #define dio0 2 #define BAND 915E6 // 全局变量定义 int rssi; String loRaMessage; String temperature; String humidity; String readingID; String suhu; String lembab; FirebaseData fbdo; // 统一改名避免和其他变量冲突 String processor(const String& var){ if(var == "TEMPERATURE"){ return temperature; } else if(var == "HUMIDITY"){ return humidity; } else if (var == "RSSI") { // 修正拼写错误 return String(rssi); } return String(); } void startLoRA(){ int counter = 0; // 初始化计数器 LoRa.setPins(ss, rst, dio0); while (!LoRa.begin(BAND) && counter < 10) { Serial.print("."); counter++; delay(500); } if (counter >= 10) { Serial.println("Starting LoRa failed!"); while(1); // 初始化失败直接停机,避免后续逻辑异常 } Serial.println("LoRa Initialization OK!"); } void setup(){ Serial.begin(115200); // 先连WiFi WiFi.begin(ssid, password); Serial.print("Connecting to WiFi"); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println("\nConnected to the Network"); Serial.print("IP Address: "); Serial.println(WiFi.localIP()); // WiFi连接成功后再初始化Firebase Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH); Firebase.reconnectWiFi(true); // 开启WiFi自动重连 startLoRA(); } void loop(){ int packetSize = LoRa.parsePacket(); if (packetSize){ // 修正LoRa读取逻辑,读完缓冲区再处理数据 String LoRaData = ""; while (LoRa.available()){ LoRaData += (char)LoRa.read(); } Serial.print("Received LoRa packet: "); Serial.println(LoRaData); // 读取RSSI rssi = LoRa.packetRssi(); Serial.print("With RSSI "); Serial.println(rssi); // 解析数据,先判断分隔符位置避免越界 int pos1 = LoRaData.indexOf('/'); int pos2 = LoRaData.indexOf('&'); if(pos1 == -1 || pos2 == -1 || pos2 <= pos1) { Serial.println("Invalid packet format"); return; } readingID = LoRaData.substring(0,pos1); temperature = LoRaData.substring(pos1 + 1, pos2); humidity = LoRaData.substring(pos2 + 1, LoRaData.length()); if (readingID == "001"){ suhu = temperature; Serial.print(F("Suhu: ")); Serial.print(suhu); Serial.println(F("°C")); lembab = humidity; Serial.print(F("Kelembaban: ")); Serial.print(lembab); Serial.println(F("%")); String fbsuhu = suhu + "°C"; String fblembab = lembab + "%"; // 修正传入的FirebaseData对象名,使用规范路径,增加错误打印 if(Firebase.setString(fbdo, "/sensor001/temperature", fbsuhu)){ Serial.println("Temperature uploaded to Firebase"); } else { Serial.print("Upload temp failed, reason: "); Serial.println(fbdo.errorReason()); } if(Firebase.setString(fbdo, "/sensor001/humidity", fblembab)){ Serial.println("Humidity uploaded to Firebase"); } else { Serial.print("Upload humidity failed, reason: "); Serial.println(fbdo.errorReason()); } } } }
额外注意事项
- 请确认Arduino IDE中安装的是适配ESP32的
Firebase ESP32 Client库,不要安装适配其他平台的旧版Firebase库,否则会出现API不匹配的问题。 - 测试阶段可先在Firebase控制台将数据库访问规则设置为允许任意读写,调试完成后再根据设备密钥配置对应权限,避免权限拦截导致上传失败。
- 请确认LoRa发送端的数据包格式为
设备ID/温度值&湿度值(例如001/26.5&68.2),否则解析逻辑会出错。
内容的提问来源于stack exchange,提问作者Mohammad Alif
相关产品推荐
相关产品推荐

