Прошу помощи с принятии данных по юарт

ShadowFlash
Offline
Зарегистрирован: 20.06.2019

Всем привет, Нужно принимать данные с ардуино на nodemcu по юарт, данные приходят но я не знаю как их фильтровать. Допустив мне с меги на ноду приходят три значения (в таком формате - -3277066, где -32 температура, 770 давление и 66 влажность), как мне их разделить на три переменные на ноде?

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Если не использовать разделители - задача нетривиальна

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Или за sscanf() читай

ShadowFlash
Offline
Зарегистрирован: 20.06.2019

Ошибка invalid conversion from 'char' to 'const char*' [-fpermissive]

Что не так?

#define BLYNK_PRINT Serial

int d;
int t;
int v;
int flag = 0;
int p1;
int p2;
int p3;



bool rele;
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

char auth[] = "bb3b1fc1d6e44068b3ae42479cb1a6b3";
char ssid[] = "TP-LINK_EA5B3C";
char pass[] = "20152015";

#define PIN_UPTIME V5

// This function tells Arduino what to do if there is a Widget
// which is requesting data for Virtual Pin (5

// This command writes Arduino's uptime in seconds to Virtual Pin (5)
BLYNK_READ(V5) // Widget in the app READs Virtal Pin V5 with the certain frequency
{
  // This command writes Arduino's uptime in seconds to Virtual Pin V5
  Blynk.virtualWrite(5, t);
}
BLYNK_READ(V4) // Widget in the app READs Virtal Pin V5 with the certain frequency
{
  // This command writes Arduino's uptime in seconds to Virtual Pin V5
  Blynk.virtualWrite(4, v);
}
BLYNK_READ(V3) // Widget in the app READs Virtal Pin V5 with the certain frequency
{
  // This command writes Arduino's uptime in seconds to Virtual Pin V5
  Blynk.virtualWrite(3, d);
}
BLYNK_WRITE(V1)
{

  rele = param.asInt();
  Serial.print(rele);
}

void setup()
{
  // Debug console
  Serial.begin(115200);
  pinMode(14, INPUT);
  Blynk.begin(auth, ssid, pass);
}

void loop()
{
  Blynk.run();
  if (Serial.available() > 0) {
   // int r = Serial.parseInt();
  //  Serial.print(t);
   const char str = Serial.parseInt();
    if (sscanf(str, "%d,%d,%d", &p1, &p2, &p3) == 3) {
     p1 = d;
     p2 = t;
     p3 = v;
    }
  }
}


 

sadman41
Offline
Зарегистрирован: 19.10.2016

Странно, что ошибка только одна. parseint уже отдает int, a не char* - это раз. Указатель объявлен, но на что он указывает... это два.

ShadowFlash
Offline
Зарегистрирован: 20.06.2019

sadman41 пишет:

Странно, что ошибка только одна. parseint уже отдает int, a не char* - это раз. Указатель объявлен, но на что он указывает... это два.

поменял строку 64 на - char str = Serial.read(); , та же ошибка, Не подскажете что исправить?

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ошибка у Вас идеологическая - видимо раньше на PHP писали. Первый аргумент функции sscanf - ASCIIZ строка. Знаете, что такое строка в Си?

ShadowFlash
Offline
Зарегистрирован: 20.06.2019

sadman41 пишет:

Ошибка у Вас идеологическая - видимо раньше на PHP писали. Первый аргумент функции sscanf - ASCIIZ строка. Знаете, что такое строка в Си?

Моя ошибка в том что я вместо программирования, поступил на радиоаппаратостроение, и максимум на чем писал, так это паскаль в 9 классе. Вообщем я полный профан в этой области, поэтому не имею понятия о чем Вы.

sadman41
Offline
Зарегистрирован: 19.10.2016

Тогда я бы советовал повникать вот в это, а не парсить строки: http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/chtenie-sostoyaniya-porta-v-peremennuyu

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ShadowFlash пишет:
Допустив мне с меги на ноду приходят три значения (в таком формате - -3277066, где -32 температура, 770 давление и 66 влажность), как мне их разделить на три переменные на ноде?

Никак.

Никто, никогда и ниоткуда не узнает, что температура это именно две цифры, а не одна, скажем, или не три. Также никто не знает сколько цифр во влажности.

Вым нужно продумать нормальный формат передачи. Тогда и разбирать будет легко.

ShadowFlash
Offline
Зарегистрирован: 20.06.2019

ЕвгенийП пишет:

ShadowFlash пишет:
Допустив мне с меги на ноду приходят три значения (в таком формате - -3277066, где -32 температура, 770 давление и 66 влажность), как мне их разделить на три переменные на ноде?

Никак.

Никто, никогда и ниоткуда не узнает, что температура это именно две цифры, а не одна, скажем, или не три. Также никто не знает сколько цифр во влажности.

Вым нужно продумать нормальный формат передачи. Тогда и разбирать будет легко.

А если без давления, то есть будет два значения по две цифры, не подскажете как это реализивать?

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

ShadowFlash пишет:

sadman41 пишет:

Ошибка у Вас идеологическая - видимо раньше на PHP писали. Первый аргумент функции sscanf - ASCIIZ строка. Знаете, что такое строка в Си?

Моя ошибка в том что я вместо программирования, поступил на радиоаппаратостроение, и максимум на чем писал, так это паскаль в 9 классе. Вообщем я полный профан в этой области, поэтому не имею понятия о чем Вы.

Можешь перевестись, еще не позна. После 2-го курса еще можно. Переводись.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Или ты думаешь, что если ты ник qwerty13rus сменил на противоположный, никто тебя тут не узнает?

ShadowFlash
Offline
Зарегистрирован: 20.06.2019

Эх спалился, был еще вариант бабой прикинуться, но решил не жестить. А на самом деле просто забыл пароль

b707
Offline
Зарегистрирован: 26.05.2017

ShadowFlash пишет:

А если без давления, то есть будет два значения по две цифры, не подскажете как это реализивать?

тебе намекнули - а ты все равно не понял.

Пишу прямым текстом - не надо слать цифры подряд.

Вот если послать так - |32#770%66$ - то не возникнет никаких сложностей отделить одно от другого

sadman41
Offline
Зарегистрирован: 19.10.2016

Дак зачем вся эта карусель с парсингом, если можно прямо в байтах забросить?

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Дак зачем вся эта карусель с парсингом, если можно прямо в байтах забросить?

да, согласен, как-то уже привык. что новички байты слать не умеют...

ТС - один байт температура. два байта давление, один - влажность. И вообще ничего разделять не надо будет.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:
как-то уже привык. что новички байты слать не умеют...
Так ему ж дали ссылку в #8

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ShadowFlash пишет:

А если без давления, то есть будет два значения по две цифры, не подскажете как это реализивать?

Уже подсказал, и не только я, а ещё полфорума 

ЕвгенийП пишет:

Вам нужно продумать нормальный формат передачи. Тогда и разбирать будет легко.

ShadowFlash
Offline
Зарегистрирован: 20.06.2019

Спасибо

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

sadman41 пишет:

Дак зачем вся эта карусель с парсингом, если можно прямо в байтах забросить?

Ну, да! А вдруг там 16-тиричное значение придётся "забрасывать"? Тут вот инженер программист был с каким-то ахрененным бэкгроундом, и тот ... трудно это вобчем!

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ShadowFlash, Кто эти данные передаёт? Ты сам или чужой прибор? Если сам, так передавай их хоть через запятую и вытаскивая спокойно Serail.parseInt и не пужри всем мозги