Ключевое ?лово

vk

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
Железо для умного дома

ТЕМА: Конструктор кода в конструкторе прошивки ESP8266

Конструктор кода в конструкторе прошивки ESP8266 24 Окт 2017 07:53 #19961

  • Adminhs
  • Adminhs аватар
  • Не в сети
  • Администратор
  • Сообщений: 7195
  • Спасибо получено: 1114
  • Репутация: 194
pdataX++; нужно после того как нашло пробел и нужно эту переменную сместить, которую выдал os_strstr , чтоб уже вытаскивать данные с нужного места, а то получается, что происходит попытка вытащить из строки вида " 503" и обрабатывается пробел, а не 503.

Как будет все ясно в работе данного кода, то можно будет запихать в прошивку в виде модуля.
Основной канал проекта в Telegram t.me/wifi_iot
Администратор запретил публиковать записи гостям.
Спасибо сказали: Maker39

Конструктор кода в конструкторе прошивки ESP8266 24 Окт 2017 21:48 #19978

  • Maker39
  • Maker39 аватар
  • Не в сети
  • Завсегдатай
  • Сообщений: 223
  • Спасибо получено: 12
  • Репутация: 0
Так и не найдя описания функции pdataX++
Навтыкал "как понимаю" :blush:
int gr_v; //сеть напряжение
int gr_f; //сеть частота
int out_v; //выход напряжение
int out_f; //выход частота 
int out_va; //мощность VA
int out_w; //мощность W
int load; //нагрузка
int bus_v; // xz
int bat_v; //батарея напряжение
int ch_i; //ток заряда
int cap; //емкость
int temp; //температура
int pv_i; //ток панели
int pv_v; //напряжение панели
int scc_v; //SCC напряжение
int dis_i; //ток разряда


void ICACHE_FLASH_ATTR
startfunc(){
// выполняется один раз при старте модуля.
}

void ICACHE_FLASH_ATTR
timerfunc(uint32_t timersrc) {
// выполнение кода каждую 1 секунду
if(timersrc%10==0){
// отравка QPIGS<crc><cr>
uint8_t send_buf[] = {0x51,0x50,0x49,0x47,0x53,0xB7,0xA9,0x0D};
uart0_tx_buffer(send_buf,8);
//
char *pdata0 = rxbufbr;

pdata0++;
char *pdata1 = NULL;
pdata1 = (char *)os_strstr(pdata0, " ");

if (pdata1 != NULL) { // нашло пробел.
  char testdata[10];
  memset(testdata,0,10);

  uint8_t len=pdata1-pdata0;
  if (len>9) len=9;

  os_memcpy(&testdata, pdata0, len);
 gr_v=chartoatoi(testdata); //  ошибка компилятора , без опции UPS Monitor
valdes[0]=gr_v;

pdata1++;
pdata1++;
char *pdata2 = NULL;
pdata2 = (char *)os_strstr(pdata1, " ");
            if (pdata1 != NULL) { // нашло пробел.
                
memset(testdata,0,10);
os_memcpy(&testdata, pdata1, pdata2-pdata1);  
gr_f=chartoatoi(testdata);

pdata2++;
pdata2++;
char *pdata3 = NULL;
pdata3 = (char *)os_strstr(pdata2, " ");
            if (pdata3 != NULL) { // нашло пробел.
                
memset(testdata,0,10);
os_memcpy(&testdata, pdata2, pdata3-pdata2);  
out_v=chartoatoi(testdata);

pdata3++;
pdata3++;
char *pdata4 = NULL;
pdata4 = (char *)os_strstr(pdata3, " ");
            if (pdata4 != NULL) { // нашло пробел.
                
memset(testdata,0,10);
os_memcpy(&testdata, pdata3, pdata4-pdata3);  
out_f=chartoatoi(testdata);

pdata4++;
pdata4++;
char *pdata5 = NULL;
pdata5 = (char *)os_strstr(pdata4, " ");
            if (pdata5 != NULL) { // нашло пробел.
                
memset(testdata,0,10);
os_memcpy(&testdata, pdata4, pdata5-pdata4);  
out_va=chartoatoi(testdata); 

pdata5++;
pdata5++;
char *pdata6 = NULL;
pdata6 = (char *)os_strstr(pdata5, " ");
            if (pdata5 != NULL) { // нашло пробел.
                
memset(testdata,0,10);
os_memcpy(&testdata, pdata5, pdata6-pdata5);  
out_w=chartoatoi(testdata); 

        }
       }
      }
     }
    }
   }
  }
 }


void webfunc(char *pbuf) {
os_sprintf(HTTPBUFF, rxbufbr); // вывод данных на главной модуля
os_sprintf(HTTPBUFF, "<br> Сеть напр.       %s",strtofl(gr_v));
os_sprintf(HTTPBUFF, "<br> Сеть частота   %s",strtofl(gr_f));
os_sprintf(HTTPBUFF, "<br> Выход напр.     %s",strtofl(out_v));
os_sprintf(HTTPBUFF, "<br> Выход частота %s",strtofl(out_f));
os_sprintf(HTTPBUFF, "<br> Мощность VA   %s",strtofl(out_va));
os_sprintf(HTTPBUFF, "<br> Мощность  W   %s",strtofl(out_w));
}
Сработало
На главной

(220.1 50.3 220.3 50.2 3000 2525 090 111 54.24 100 111 2222 8888
Сеть напр. 220.1
Сеть частота 50.3
Выход напр. 220.3
Выход частота 50.2
Мощность VA 3000.0
Мощность W 2525.0

Попробовал отправить на FlyHUB через valdes , пришло, надо будет только из int преобразовать в что-то удобоваримое (strtofl не сработал).

Кстати strtofl тоже что-то не гуглится :(
Последнее редактирование: 24 Окт 2017 21:49 от Maker39.
Администратор запретил публиковать записи гостям.

Конструктор кода в конструкторе прошивки ESP8266 25 Окт 2017 06:02 #19985

  • Adminhs
  • Adminhs аватар
  • Не в сети
  • Администратор
  • Сообщений: 7195
  • Спасибо получено: 1114
  • Репутация: 194
pdataX++ навтыкано не верно, этот код прибавляет указатель данной переменной, чтобы пропустить найденный пробел функцией os_strstr. Удивительно, что вообще работает сейчас - натыкано наугад))

через valdes не передать данные с точкой, нужно допилить код этот и я перенесу его в функцию.
Основной канал проекта в Telegram t.me/wifi_iot
Администратор запретил публиковать записи гостям.

Конструктор кода в конструкторе прошивки ESP8266 26 Окт 2017 23:05 #20028

  • Maker39
  • Maker39 аватар
  • Не в сети
  • Завсегдатай
  • Сообщений: 223
  • Спасибо получено: 12
  • Репутация: 0
Adminhs пишет:
pdataX++ навтыкано не верно, этот код прибавляет указатель данной переменной, чтобы пропустить найденный пробел функцией os_strstr. Удивительно, что вообще работает сейчас - натыкано наугад))

через valdes не передать данные с точкой, нужно допилить код этот и я перенесу его в функцию.
Разобрался B). В скетч симулятора на ардуине изначально попал разделитель из ДВУХ пробелов (копипаст бесконтрольный из документации) :blush:
Парсер работает.
С передачей на MQTT буду разбираться.
Последнее редактирование: 26 Окт 2017 23:09 от Maker39.
Администратор запретил публиковать записи гостям.

Конструктор кода в конструкторе прошивки ESP8266 28 Окт 2017 23:11 #20046

  • Maker39
  • Maker39 аватар
  • Не в сети
  • Завсегдатай
  • Сообщений: 223
  • Спасибо получено: 12
  • Репутация: 0
Разобрал всю строку от симулятора, вроде все на месте
Надеюсь на этой неделе на железяке проверить, что-то мне подсказывает ,что в зависимости от модели и версии прошивки инвертора строка параметров будет разная.

Начал разборки с форматом данных для valdes отправки на mqtt.
И возник вопрос:
А на фига нам INT на выходе парсера?
если потом все равно в стринг, или float нужно конвертить...
Попробовал найти что-то подходящее ( atof , etc )- компилятор не переваривает,

посылает к Aдмину :)
А как ?
Администратор запретил публиковать записи гостям.

Конструктор кода в конструкторе прошивки ESP8266 29 Окт 2017 00:33 #20047

  • Dmitry77
  • Dmitry77 аватар
  • Не в сети
  • Давно я тут
  • Сообщений: 89
  • Спасибо получено: 39
  • Репутация: 11
Спасибо за ваш труд! Переменные valdis это int32 это целые числа не стринг и тд,вы можете конвертировать в них все данные привести к типу.насчет явной ошибки сдвига переменной рекомендую еще разок обратить внимание на первый пример ,что был дан разработчиком,честно говоря сам пересмотрел ваш код не один раз,не смог понять как удалось получить результат
D77
Администратор запретил публиковать записи гостям.
Модераторы: FlyRouter
Время создания страницы: 0.157 секунд

Home`s Smart © 2013-2016. г.Киров.
Цитирование материалов возможно только со ссылкой на сайт. Использование фотоматериалов только с разрешения авторов.