ESP32 Невозможно присвоить значение строке. Получение неправильного значения

Здравствуйте! У меня проблемы со строками в скетче. Я присваиваю значения своей строке (например, tempStrReturn) в функциях setNr1, setNr2. Если я передаю значение 1 функции, я получаю "" или "application/x-www-form-urlencoded", когда должно быть 1. Я не понимаю, почему это происходит.

Если вы видите распечатку вывода функции setNr1, я получаю "", то после присвоения значения (nr1+"") tempStrReturn я все еще получаю "". После того, как я использую tempStrReturn в функции setNr2, она присваивает ей значение мешанины.

Я не использую tempStrReturn, она нужна только для отображения ошибки. Когда я изменяю значения int nr1 или nr2, которые я хочу присвоить строке, меняется значение мешанины в строках. При одних и тех же числах строковое значение всегда имеет одну и ту же мешанину.

ВЫВОД:

192.168.43.140
Function setNR1............
Got: 0
NR1 int: 0
tempStrReturn before:
tempStrReturn after:
Function setNR2............
Got: 1
NR2 int: 1
tempStrReturn before:
tempStrReturn after: application/x-www-form-urlencoded
Function setID...........
String id: ID
Set msgId to: 0
Set msgPos to: 1
Function setNR1............
Got: 1
NR1 int: 1
tempStrReturn before: ID
tempStrReturn after: application/x-www-form-urlencoded
Function setNR2............
Got: 1
NR2 int: 1
tempStrReturn before: application/x-www-form-urlencoded
tempStrReturn after: application/x-www-form-urlencoded
Function setH...........
nr1: 1
nr2: 1
Created value: 11
Original value in string: 0
nrX: 0 nrPos: 1 Value i want to enter: n/x-www-form-urlencoded
Value afther assignment: n/x-www-form-urlencoded

МОЙ КОД:

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <FS.h>
#include <Wire.h>

const char* ssid = "Ti";
const char* password = "1234567891234";
// Сохраняет состояние светодиода
String ledState;
// Создаем объект AsyncWebServer на порту 80
AsyncWebServer server(80);

#define ledPin 2  // Встроенный светодиод перевернут
#define countMax 2500
#define multiplyMax 100 
int count = 0, multiply = 0, msgDel = 0;
int nr1=0, nr2=0,msgPos, msgId, msgVar;
String inOut[10][10];
String tempStr1, tempStr2, tempStrReturn;
bool oneShot = false;


//*********************************************

/*Set value of String[] on the nrPos to val*/
void inOutSet(int nrX, int nrPos, String val)
{
  Serial.print("Original value in string: "); Serial.println(inOut[nrX][nrPos]);
  Serial.print("nrX: ");Serial.print(nrX);Serial.print(" nrPos: ");Serial.print(nrPos);
  Serial.print(" Value i want to enter: "); Serial.println(val);
  inOut[nrX][nrPos] = val;
  Serial.print("Value afther assignment: ");Serial.println(inOut[nrX][nrPos]); 
}

String inOutGet(int nrX, int nrPos)
{
  return inOut[nrX][nrPos];
}


String dataRequest(int roomNr) 
{
  tempStrReturn = "";
  Serial.println("Preparing to send data as word...");
  Serial.print("Value in TempStringReturn before: "); Serial.println(tempStrReturn);
  tempStrReturn = "g" + roomNr;
  tempStrReturn = tempStrReturn+".";
  Serial.print("Adding g and . : "); Serial.println(tempStrReturn);
  nr1 = 0; nr2 = 0;

  for (int i = 0; i < 9; i++)
  {
    Serial.print("Data Request: "); Serial.println(msgId);
    tempStrReturn = tempStrReturn+inOut[roomNr][i];
    Serial.print("Ading value from inOut: "); Serial.println(tempStrReturn);
  }
  Serial.print("Returning value: ");
  Serial.println(tempStrReturn);

  return tempStrReturn;
}

//сохраняет значение в nr1 как int
String setNr1(String var)
{
  Serial.println("Function setNR1............");
  Serial.print("Got: "); Serial.println(var);
  nr1 = var.toInt();
  Serial.print("NR1 int: "); Serial.println(nr1);
  Serial.print("tempStrReturn before: "); Serial.println(tempStrReturn);
  tempStrReturn = nr1+"";
  Serial.print("tempStrReturn after: "); Serial.println(tempStrReturn);
  return nr1+"";
}

//сохраняет значение в nr2 как int
String setNr2(String var)
{
  Serial.println("Function setNR2............");
  Serial.print("Got: "); Serial.println(var);
  nr2 = var.toInt();
  Serial.print("NR2 int: "); Serial.println(nr2);
  Serial.print("tempStrReturn before: "); Serial.println(tempStrReturn);
  tempStrReturn = nr2+"";
  Serial.print("tempStrReturn after: "); Serial.println(tempStrReturn);
  return nr2+"";
}

// Создает значения для массива
String setID()
{
  Serial.println("Function setID...........");
  msgId = nr1;
  msgPos = nr2;
  nr1 = 0; nr2 = 0;
  tempStrReturn = "ID";
  Serial.print("String id: "); Serial.println(tempStrReturn);
  Serial.print("Set msgId to: "); Serial.println(msgId);
  Serial.print("Set msgPos to: "); Serial.println(msgPos);
  return "ID";
}

// Создает значение из nr1 и nr2
String setH()
{
  Serial.println("Function setH...........");
  msgVar = (nr1*10)+nr2;
  Serial.print("nr1: "); Serial.println(nr1);
  Serial.print("nr2: "); Serial.println(nr2);
  nr1 = 0; nr2 = 0;
  if (msgVar >= 99)  {  msgVar = 100;  }
  Serial.print("Created value: "); Serial.println(msgVar);
  inOutSet(msgId, msgPos, msgVar+"");
  return "H";  
}

String getIO()
{
  nr1 = nr1/10;
  return dataRequest(nr1);
}

String processor(const String& var){
  Serial.print("Processor in: ");  Serial.println(var);
  return var;
}

void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);

  //Заполнение массива inOut
  for (int i = 0; i < 10; i++)
  {
    for (int x = 0; x < 10; x++)
    {
      inOut[i][x]= "0";
    }

  }


  if(!SPIFFS.begin()){Serial.println("\nSPIFFS chyba!"); return;}

  // Подключиться к Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  // Печать локального IP-адреса ESP32
  Serial.println(WiFi.localIP());

  // Маршрут для корневой/веб-страницы
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/index.html", String(), false, processor);//изменить
  });

  // путь к фавиконке
  server.on("favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/favicon.png", "image/png");
  });

  // Маршрут для загрузки файла style.css
  server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/style.css", "text/css");
  });

  // Маршрут к javascript
  server.on("/main.js", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/main.js", "text/javascript");
  });


// №1 сообщения
  server.on("/0", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr1("0").c_str());
  });
  server.on("/1", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr1("1").c_str());
  });
  server.on("/2", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr1("2").c_str());
  });
  server.on("/3", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr1("3").c_str());
  });
  server.on("/4", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr1("4").c_str());
  });
  server.on("/5", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr1("5").c_str());
  });
  server.on("/6", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr1("6").c_str());
  });
  server.on("/7", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr1("7").c_str());
  });
  server.on("/8", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr1("8").c_str());
  });
  server.on("/9", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr1("9").c_str());
  });
// №2 сообщения
  server.on("/X0", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr2("X0").c_str());
  });
  server.on("/X1", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr2("X1").c_str());
  });
  server.on("/X2", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr2("X2").c_str());
  });
  server.on("/X3", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr2("X3").c_str());
  });
  server.on("/X4", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr2("X4").c_str());
  });
  server.on("/X5", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr2("X5").c_str());
  });
  server.on("/X6", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr2("X6").c_str());
  });
  server.on("/X7", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr2("X7").c_str());
  });
  server.on("/X8", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr2("X8").c_str());
  });
  server.on("/X9", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setNr2("X9").c_str());
  });
//конец команды для использования значений nr
  server.on("/ID", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setID().c_str());//Set ID nr
  });
  server.on("/H", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", setH().c_str());//Установить значение в id
  });
  server.on("/G", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", getIO().c_str());//Получить значение
  });

  // Запустить сервер
  server.begin();
}


/*-------------LOOP---------------*/
void loop() {
  count++;
  if (count > countMax)  {    multiply++; count = 0;  }
  if (multiply > multiplyMax)
  {
    if (!oneShot)
    {
      setNr1("0");
      setNr2("1");
      setID();
      setNr1("1");
      setNr2("1");
      setH();
      oneShot = true;
    }

    if (nr1 != 0 || nr2 != 0)
    {
      msgDel++;
      if (msgDel > 5)
      {
        nr1 = 0; nr2 = 0;
        Serial.println("DELETING...");
        msgDel = 0;
      }

    }

    // задержка (60000);
    multiply = 0;
  }
}  

, 👍0

Обсуждение

Также опубликовано в [StackOverflow](https://stackoverflow.com/q/61576911/4902099), @hcheung


1 ответ


Лучший ответ:

1

nr1+"" не используется для преобразования целого числа в строку. Все, что вы делаете, это берете значение nr1 и добавляете его к адресу строковой константы, состоящей только из \0. Затем присвоить это строке.

Результаты такой операции не определены.

Вместо этого вы должны пойти:

tempStrReturn = String(nr1);

который создаст новый объект String, заполнит его текстовым представлением значения nr1, а затем скопирует это содержимое в tempStrReturn Строка.

Однако я бы рекомендовал избегать использования String даже на таком чипе, как ESP32. Вместо этого используйте строки C (массивы символов с нулевым завершением), которые гораздо менее расточительны по ресурсам.

,

Я хочу добавить его в массив String. В функции setH я добавляю его через inOutSet() в двумерный массив inOut[][]. Затем я отправляю на свой веб-сайт строковое сообщение, которое завершается в dataRequest(). Он добавляет часть массива к одной строке, которую я отправляю обратно на свой сайт. Я знаю, что String немного перебор для бедного процессора. Любая лучшая идея?, @Tomas

Зачем вообще использовать строки? У вас есть числа. Храните их в таком виде. Вы заботитесь только о том, чтобы они были строковыми, когда вы создаете свой HTTP-запрос., @Majenko

80% значений являются числами, но не все. Я хотел иметь один массив inOut со всеми моими значениями. Я пытаюсь сделать веб-интерфейс. Этот массив inOut будет хранить значения аналоговых значений, цифровых значений или сообщений типа «Что-то переполнено». Я создал веб-сайт и javascript, поэтому мне не нужно менять html, css или javascript. Все, что мне нужно сделать, это запрограммировать скетч., @Tomas

Вам действительно нужно хранить текст «Что-то переполнено» в вашем массиве? Почему бы просто не использовать простой флаг, который говорит о том, что что-то переполнено, а затем, когда вы создаете свой запрос, вы говорите: «Является ли что-то переполненным флагом 1? Да? Хорошо, отправьте« что-то переполнено »»., @Majenko

Я использую его как адреса. inOut[0][1] — первый элемент на первой странице. Он должен быть модульным. Я не знаю заранее, какой адрес будет int и какая строка или какой текст будет в ней, @Tomas

Теперь я понимаю, что массив должен быть целым, и только когда я завершаю запрос строки, я добавляю сообщения. Спасибо так и сделаю. Вы мне очень помогли, @Tomas