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;
}
}
@Tomas, 👍0
Обсуждение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
- Инициализатор ошибок-строка для массива символов слишком длинная с использованием веб-сервера ESP32
- Как преобразовать форматированный оператор print в строковую переменную?
- Преобразование строки в IP-адрес
- ESP32 в Arduino-IDE с FS.h и SPIFFS
- Почему функция server.on() из "ESPAsyncWebServer.h" выполняется на стороне setup(), а не на стороне loop()?
- Как прочитать входящие ШЕСТНАДЦАТИРИЧНОЕ значение из serial метод read ()?
- Интернет-сервер Arduino IDE + ESP32 — как перенаправить на root после нажатия кнопки
- Автоматическая веб-страница ESP32 AP
Также опубликовано в [StackOverflow](https://stackoverflow.com/q/61576911/4902099), @hcheung