Нужна помощь в проекте (передача данных на сайт Народный мониторинг)

Тема в разделе "Arduino & Shields", создана пользователем DZent, 26 сен 2013.

  1. Megakoteyka

    Megakoteyka Оракул Модератор

    Вы приводите переменную типа float к типу int - целочисленному. В этот момент дробная часть отбрасывается.

    По поводу itos(...). Там заводится буфер длиной 3 байта. Последний символ - конец строки. Следовательно, функция может преобразовать число длиной не более двух символов. Строки обрабатываются до появления символа конца строки - \0. Если каким-либо образом в функцию попадет число, состоящее из 3х символов - затрется символ конца строки. Тогда, поскольку символ конца строки будет затерт, код, обрабатывающий эту строку, пойдет гулять по памяти до тех пор, пока не наткнется на \0, а это может произойти где угодно. при считывании строки Вы просто получите мусор. при копировании строки Вы неизбежно испортите память.
    Либо делайте буфер с гарантированным запасом, либо проверяйте входные данные на корректность.
    Отличие itos от sprintf в заключается в том, что itos может принять только int, строковое представление которого занимает не более 2х символов, иначе функция отработает неправильно, как я описал абзацем выше. Функция sprintf позволяет задать формат преобразования (например, количество знаков после запятой для вещественного числа) и принимает аргументы любого типа. И не жалейте несколько лишних байт для буфера строки - хуже не будет, а вот датчик вполне может сбойнуть и вернуть 369 вместо 25. Хулиган нагреет датчик зажигалкой и Ваша программа зависнет либо порушит память и вылетит.
     
    Последнее редактирование: 3 окт 2013
  2. StarT

    StarT Нуб

    В общем то код представленный здесь оказался не совсем рабочим. Пришлось его подправить. Сейчас нареканий у меня к нему нет. Хотя зажигалками и хулиганами не проверял, ну так и устройство для дома, а не для общественных мест. Исправленную версию работающую с DHT22 как с цифровым датчиком вставил в блог если что.

    Для приведения float к char использовал dtostrf(DHT.temperature, 4, 1, CurTemp);
    Приношу извинения за ошибочный код.
     
    Последнее редактирование: 16 июн 2019