Změna typu proměnné

Odpovědět
tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48

Změna typu proměnné

Příspěvek od tosik » 12 dub 2023, 23:35

Zdravím.

Potřebuji z řetězce vypreparovat číselnou část a tuto převést na číslo typu integer. Vypreparovat mi to jde, tisk na sériovou linku ukazuje, že je to OK, ale když to pak dám odeslat do NODE-RED, přijde mi 0 (nula). Řekl bych, že špatně převádím typy proměnných. Jak udělám, aby výsledek byla proměnná typu int? Získané číslo pak potřebuji vložit do proměnné pozadTeplKuchyn , která je deklarovaná jako integer a odeslat pomocí MQTT do NODE-RED. Po spuštění jednotky se odešle výchozí hodnota proměnné pozadTeplKuchyn správně. Ale když přijmu řetězec z NODE-RED, kterým chci nastavit novou hodnotu, a níže uvedeným kódem získám z tohoto řetězce požadované číslo, které vložím do proměnné pozadTeplKuchyn , odesílá se 0, místo požadovaného čísla. Kde dělám chybu? Vím, že tam už těch převodů mám hodně, ale zkoušel jsem, co se dá, a nic. Tak sem dávám poslední verzi marného pokusu... Fce callback je správně (není moje ... :-D, proto funguje), já řeším tu část od prvního if, tam je někde chyba. Ty výpisy na sériovou linku tam mám jen pro ladění...

Kód: Vybrat vše

void callback(char* topic, byte* message, unsigned int length) {
  // výpis na sériovou linku, že byla přijatá zpráva
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;
  
  for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  
  if (String(topic) == "ridiciEsp32/nastavHlidanouTepl") {
    Serial.print("Přišlo: ");
    Serial.println(messageTemp);

    int pozicedvojtecky = messageTemp.indexOf(':');
    Serial.print("Pozice : je: ");
    Serial.println(pozicedvojtecky);
    
    int poziceZavorky = messageTemp.indexOf('}');
    Serial.print("Pozice }: ");
    Serial.println(poziceZavorky);        

    String hodnota = messageTemp.substring(pozicedvojtecky,poziceZavorky);
    Serial.print("Výřez 16/18: ");
    Serial.println(hodnota);

    char buf[6];
    hodnota.toCharArray(buf,6);
    Serial.print("Nová hlídaná teplota převedená na char: ");               
    Serial.println(buf);

    Serial.print("Nová hlídaná teplota: ");               
    pozadTeplKuchyn = (int)atoi(buf);   
    Serial.println(pozadTeplKuchyn);    
  }
}

AstroMiK
Příspěvky: 608
Registrován: 08 pro 2017, 19:05

Re: Změna typu proměnné

Příspěvek od AstroMiK » 13 dub 2023, 17:20

Tohle:

Kód: Vybrat vše

    String hodnota = messageTemp.substring(pozicedvojtecky,poziceZavorky);
nahradit tímhle:

Kód: Vybrat vše

    String hodnota = messageTemp.substring(pozicedvojtecky + 1 ,poziceZavorky);
Problém bude asi v tom, že v tom poli 'buf[]' je jako první znak uložená ta dvojtečka před číslem a s tím si pak následně "atoi" neporadí, takže vrací nulu.
Když se to do 'buf[]' začne ukládat až následující znak po dvojtečce, tak to snad začne fungovat.

Jestli ne, tak sem hoď celý ten řetězec 'messageTemp', který se zpracovává.

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48

Re: Změna typu proměnné

Příspěvek od tosik » 13 dub 2023, 20:57

Pane Bože, ja su ko..t, celý večer v pr..li a nepřišel jsem na to. Samozřejmě, že to je tím. Nevšimnul jsem si ve výpisu na sériové lince té dvojtečky před vypreparovaným číslem. Díky moc.

Arthur
Příspěvky: 39
Registrován: 02 čer 2021, 03:37

Re: Změna typu proměnné

Příspěvek od Arthur » 18 kvě 2023, 16:38

Je v této větě nějaká chyba?pozadTeplKuchyn = (int)atoi(buf);

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti