Является ли это объявление класса неправильным? Ошибка "Declaration has no storage class or type specifier"
При попытке настроить ESP32 как издателя mqtt я получаю странные ошибки. Вот мой код:
#include "mqttSetup.h"
#include <WiFi.h>
#include <PubSubClient.h>
static byte httpFailCounter = 0;
byte counter = 0;
const char *ssid = "SSID";
// const char *password = "xxxxx";
const char *passphrase = "xxxxx";
WiFiClient espClient;
const char *mqtt_server = "192.168.1.39";
const int mqttPort = 1883;
const char *mqttUser = "xxxx";
const char *mqttPassword = "xxxxx";
PubSubClient pubClient(espClient);
pubClient.setServer(mqtt_server, mqttPort);
void checkConnection()
{
if (WiFi.status() == WL_CONNECTED)
{
counter = 0; //reset counter
}
else if (WiFi.status() != WL_CONNECTED)
{
WiFi.begin(ssid, passphrase);
}
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
counter++;
if (counter >= 60)
{
ESP.restart();
}
}
}
void reconnect()
{
while (!pubClient.connected())
{
Serial.print("Attempting MQTT connection...");
// Create a random client ID
const char *clientID = "ESP32D-MQTT";
// Attempt to connect
if (pubClient.connect(clientID))
{
Serial.println("connected");
// Once connected, publish an announcement...
pubClient.publish("outTopic", "Hello from ESP");
// ... and resubscribe
// client.subscribe("inTopic");
}
else
{
Serial.print("failed, rc=");
Serial.print(pubClient.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
Я не понимаю, почему компилятор выплевывает следующие две ошибки:
this declaration has no storage class or type specifier (referring to my pubClient declaration)
expected a ';'
У него нет никаких проблем, когда я объявляю pubClient, но в строке :
pubClient.setServer(mqtt_server, mqttPort);
там, где я использую pubClient, он выдает ошибку.
Кроме того, я не вижу ничего недостающего в коде.
Не могли бы вы помочь мне выяснить источник ошибки?
Заголовочный файл для этого фрагмента кода
#ifndef MQTTSETUP_H
#define MQTTSETUP_H
void checkConnection();
void reconnect();
#endif
------------ Основной скетч - - - - - - - - - -
#include <Arduino.h>
#include "Wire.h"
#include "tempSensor.h"
#include "mqttSetup.h"
void setup()
{
Wire.begin();
Serial.begin(115200);
while (!Serial)
;
shtBegin();
checkConnection();
}
void loop()
{
uint32_t newTime = millis();
static uint32_t oldTime = 0;
static uint32_t t2 = 0;
float temp = 0.0;
float humid = 0.0;
char senVals[50];
if (newTime - oldTime >= 10000)
{
oldTime = newTime;
readsht(temp, humid);
snprintf(senVals, 50, "Temp: %.2f Humid: %.2f", temp, humid);
Serial.println(senVals);
}
}
@Zaffresky, 👍0
1 ответ
Лучший ответ:
Код идет в функциях, а не в глобальной области видимости.
Ваша линия
pubClient.setServer(mqtt_server, mqttPort);
должно быть, внутри функции. Скорее всего, setup ()
, поэтому он вызывается при запуске вашей программы.
Кстати, где setup()
и loop()
- две функции, которые требуются кодом Arduino?
- Присоедините функцию Arduino ISR к члену класса
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Как выбрать альтернативные контакты I2C на ESP32?
- Драйверы для чипа последовательного порта CH9102X
- Как преобразовать форматированный оператор print в строковую переменную?
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
Этот фрагмент кода содержится в отдельном файле .cpp. Я пытался сохранить основной скетч чистым от настроек и определений функций для разных компонентов. Вот почему вы не видите главного скетча. Я намеревался вызвать только функцию публикации (еще не реализованную в моем коде) в основном скетче. Я обновлю свой пост заголовочным файлом и основным скетчем, @Zaffresky
@Zaffresky Тогда вы должны обернуть эту строку в функцию, которую затем можете вызвать из "setup()`., @Majenko
Я обновил свой пост основным скетчем и соответствующим заголовочным файлом. Я не совсем понимаю, почему я должен поместить строку "PubClient.setServer(mqtt_server, mqttPort);" в новую функцию. Насколько я понимаю, функция PubClinet.serServer уже определена в библиотеке PubSubClient и в моем отдельном mqttSetup.cpp файл Я вызывал эту функцию, чтобы этот файл был самодостаточным, и мне не нужно было вызывать какие-либо библиотечные функции PubSubClient непосредственно в главном скетче. Скорее всего, я бы вызвал свою функцию publishMQTT() только в главном скетче. Является ли этот подход неправильным?, @Zaffresky
@Zaffresky Потому что ** код идет в функциях, а не в глобальной области **. Все, что вы вызываете во время последовательности выполнения вашей программы, * должно * идти в функции. Единственное, что может входить в глобальную область видимости, - это объявления переменных (с непосредственным назначением или без него)., @Majenko
Теперь я это вижу. Я не рассматривал область действия в этом отдельном файле .cpp. Я ошибочно предположил, что понятие масштаба применимо только к основному скетчу. Спасибо за разъяснение, @Zaffresky