• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Конвертация char в int

sega6548

New member
Всем привет, имею вот такой код,в котором получаю значения 0 - 1024 по mqtt данные приходят и пытаясь их подсунуть в шим лед ленты выдает ошибка о конвертации, подскажите как правильно конвертировать значения из топика в значения шим, скетч не ругался только на int stled = strPayload.toInt(); но тогда возникает другая проблема, при получении топика выше 1000 и последующем получении топика ниже 1000, например 900 эта строчка как бы оставляет лишний знак, тоесть пришло например 1021 все отлично, лента почти погасла, потом пришло например 805 а на шим конвертируется 8051 тоесть добавляется последний знак четырех значного топика, и все до перезагрузки, вот код
Код:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char *ssid =  "Rostelecom_Inactivated";  //название сети
const char *password =  "*******";            //пароль сети
const char *mqtt_server = "192.168.1.2";       //адрес mqtt брокера

WiFiClient espClient;           //инициализация вифи
PubSubClient client(espClient); //инициализация mqtt клиента

#define REDPIN 15
#define BUFFER_SIZE 100
#define FADESPEED 2

void callback(char* topic, byte* payload, unsigned int length)
{
  Serial.println();
  Serial.print(topic);   // выводим в сериал порт название топика
  Serial.print(" => ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  } // выводим в сериал порт значение полученных данных

  String strTopic = String(topic);
  String strPayload = String((char*)payload);


  if (strTopic == "ESP03/led")
  {
  
    int stled = strPayload.toInt(); // оставляет последний знак от 4-х значного топика
    analogWrite(REDPIN, stled);
    Serial.print(stled);
  }
}

void setup() {
  pinMode(REDPIN, OUTPUT);
  Serial.begin(115200);
}

void loop() {

  if (WiFi.status() != WL_CONNECTED) //если нет подключения к вифи
  {
    WiFi.begin(ssid, password); //конектимся
    if (WiFi.waitForConnectResult() != WL_CONNECTED)
      return; //если не получилось то повторяем
  }
  if (WiFi.status() == WL_CONNECTED) //если подключились
  {
    if (!client.connected()) //если нет mqtt
    { // то подключаемся к mqtt
      client.setServer(mqtt_server, 1883);
      client.setCallback(callback);
      client.connect("ESP03led");        //id клиента(должно быть уникальным в сети)
      client.subscribe("ESP03/led");     //подписываемся на топик
    }
    if (client.connected()) {   // если подключились
      client.loop();            // то запускаем цикл получения топиков)))
    }
  }
}
 

sboganov

Member
Код:
  String strPayload = String((char*)payload);
В C окончание строки считается нулем. А MQTT через переменную передает сколько байтов переслано. Поэтому цикл от 0..length показывает правильное значение - а в выделенной строке копирование идет до нулевого байта. Поэтому и попадает мусор от предыдущего пакета.
 

sega6548

New member
[/QUOTE]
В C окончание строки считается нулем. А MQTT через переменную передает сколько байтов переслано. Поэтому цикл от 0..length показывает правильное значение - а в выделенной строке копирование идет до нулевого байта. Поэтому и попадает мусор от предыдущего пакета.
и что нужно сделать?
 

sboganov

Member

и что нужно сделать?[/QUOTE]
Грязный хак - payload[length] = 0;

А так надо создать буфер, обнулить а потом скопировать первые length байтов. Может даже это в реализации класса String есть...
 

sega6548

New member
и что нужно сделать?
Грязный хак - payload[length] = 0;

А так надо создать буфер, обнулить а потом скопировать первые length байтов. Может даже это в реализации класса String есть...[/QUOTE]
Спасибо, очень выручил грязным хаком))) надо блин изучать как все это работает...
 

Scorpio

New member
Или так:
Код:
String strPayload="";
for (int i = 0; i < length; i++) strPayload+=(char)payload[i];
Serial.println(strPayload);
.....................................
int stled = strPayload.toInt();
 
Последнее редактирование:
Сверху Снизу