• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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();
 
Последнее редактирование:
Сверху Снизу