You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
  }
 }
}

错误点定位

  1. 直接触发编译报错的核心问题:定义的Firebase数据对象名为data(FirebaseData data;),但调用Firebase.setString时传入的是类型名FirebaseData而非实例化的变量名,编译器无法识别就会抛出「缺少主表达式」的错误。
  2. 初始化顺序错误:先调用Firebase.begin()再连接WiFi,Firebase依赖网络连接,初始化顺序颠倒会导致后续根本连不上Firebase服务。
  3. 未初始化变量:startLoRA函数内的counter变量定义后没有赋初始值,默认值为内存随机数,会直接导致LoRa初始化重试判断逻辑失效。
  4. LoRa数据读取逻辑冲突:先调用LoRa.readString()读完了整个数据包缓冲区,后面又循环调用LoRa.read()读空缓冲区,既会导致串口打印乱码/无输出,还可能引发RSSI取值异常。
  5. 拼写错误:processor函数中判断RSSI的字符串写为"RRSI",多写了一个R,会导致对应变量替换逻辑失效。
  6. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:42:17