обработка данных Serial

virusolog
Offline
Зарегистрирован: 07.07.2020

Здравствуйте! на борту esp8266 делает запрос на хостинг.. получает ответ вида 100111011-где любая цифра это состояние пина на ардуинке ..либо включен либо выключен

далее этот набор цифр принимает mega2560 в Serial3 .. собственно проблема в том как разбить этот набор цифр по одной..и записать в переменные.. 

1- pin24

0-pin25 

0-pin26 .... 

если делать запрос и получать одну цифру..проблем бы не было..но это  очень много запросов.. поэтому хост выдает одной строкой состояние всех пинов ..

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

virusolog пишет:

как разбить этот набор цифр по одной..и записать в переменные.. 

1- pin24

0-pin25 

0-pin26 .... 

Написать парсер входного кода и распихиватель по переменным. 

virusolog
Offline
Зарегистрирован: 07.07.2020

да в этом то и проблема.. 

unsigned long data = Serial3.parseInt();
Serial.println(data,DEC);  
 
 data-здесь я получил набор цифр 100111.. 
 далее мне нужно записать каждую отдельную цифру в переменную...
только как..бьюсь 4й день..
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

virusolog пишет:

бьюсь 4й день..

ну так показывай, как бьёшься. 

virusolog
Offline
Зарегистрирован: 07.07.2020
Это залито в esp8266 все четко делает запрос на хост..получает набор цифр 10001110001....
отсылает все в serial3 ардуинки ..

#include <Wire.h> 
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#define USE_SERIAL Serial
ESP8266WiFiMulti WiFiMulti;

void setup() {
  
    USE_SERIAL.begin(9600);
   // USE_SERIAL.setDebugOutput(true);
    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();
    for(uint8_t t = 4; t > 0; t--) {
        USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
        USE_SERIAL.flush();
        delay(1000);
    }
    WiFiMulti.addAP("omen", "2627F68597");
}
void loop() {
    // ожидание WiFi соединения
    if((WiFiMulti.run() == WL_CONNECTED)) {
        HTTPClient http;
        ///USE_SERIAL.print("[HTTP] begin...\n");
        http.begin("moysait.ru", 80, "/api.php"); //HTTP
        ///USE_SERIAL.print("[HTTP] GET...\n");
        // начало соединения и отсылка HTTP заголовка
        int httpCode = http.GET();
        if(httpCode) {
            // HTTP header has been send and Server response header has been handled
            ///USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);
            // файл найден на сервере
            if(httpCode == 200) {
               String payload = http.getString();
               USE_SERIAL.println(payload);
               
               
            }
        } else {
            USE_SERIAL.print("[HTTP] GET... failed, no connection or no HTTP server\n");
        }
    }
    delay(500);
}

 

virusolog
Offline
Зарегистрирован: 07.07.2020
это залито в ардуинке..принимаю из  serial3  и кидаю в serial дабы все действо наблюдать в
мониторе порта

unsigned long data;

    
void setup() {
Serial.begin(9600); // устанавливаем последовательное соединение
Serial3.begin(9600);
}
  
void loop() {
if (Serial3.available() > 0) {  //если есть доступные данные
unsigned long data = Serial3.parseInt();
Serial.println(data,DEC);
delay(100);
}
}

 

virusolog
Offline
Зарегистрирован: 07.07.2020
void loop() {
if (Serial3.available() > 0) {  //если есть доступные данные
unsigned long data = Serial3.parseInt();
Serial.println(data,DEC);

data=data.charAt(2);
Serial.println(data);

delay(100);
}
}
ошибка прикомпиляции
request for member 'charAt' in 'data', which is of non-class type 'long unsigned int'

 

FoxJone
Offline
Зарегистрирован: 19.04.2019

Вы неправильно понимаете работу parseInt

Он ваш ТЕКСТ "100111011" воспринимает как одно число.

rkit
Offline
Зарегистрирован: 23.11.2016

virusolog пишет:

unsigned long data = Serial3.parseInt();

А почему ты читаешь unsigned long, когда пишешь String? Да еще и функцией parseInt?

virusolog
Offline
Зарегистрирован: 07.07.2020

спасибо. просто это единственный способ которого я добился что бы корректно получить данные от esp8266

в мониторе порта ардуино.. а как эти 100111011 цифры разбить по одной.. заранее извиняюсь за некомпетентность.. я больше в php все время..только открываю мир контроллеров

virusolog
Offline
Зарегистрирован: 07.07.2020

если просто long то выводит не все цифры в строке...5 или 6 ... а parseInt() единственное что хоть как то правильно передает в порт

virusolog
Offline
Зарегистрирован: 07.07.2020

если просто принимать serial.read() прилетает что то типа 50 ...10 .. или 216...114... вместо 1000111000...

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

10101001 приходит строкой? У String есть метод, выдающий указатель на char[]. Указатель берите и бегите с ним, пока не встретите NULL. Каждый следующий символ - "состояние" пина.

Что-то вроде:

char* ptr = String.Тот_самый_метод();
while (*ptr != NULL)  {
  // Можно заменить на switch()
  if (*ptr == '0') { выключил; }
  if (*ptr == '1') { включил; }
  if (*ptr == '2') { помигал; }
  ptr++;
}

 

virusolog
Offline
Зарегистрирован: 07.07.2020
Всем ОГРОМНОЕ СПАСИБО!!! вот код заработал.!!!
void setup() {
Serial.begin(9600); // устанавливаем последовательное соединение
Serial3.begin(9600);
}
  
void loop() {
if (Serial3.available() > 0) {  //если есть доступные данные
unsigned long data = Serial3.parseInt();
//Serial.println(data,DEC);

тут делаем конвертацию из чисел 
unsigned long a=data;
char b[1];
String str;
str=String(a);
str.toCharArray(b,1);

Serial.println(str[8]); //здесь можно выводить любуюцифру из строки

delay(100);
}
}

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

В Arduino.h есть макрос для побитового чтения числа

bitRead(value, bit)	// Читает бит под номером bit в числе value

 

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

v258 пишет:

В Arduino.h есть макрос для побайтового чтения числа

bitRead(value, bit)	// Читает бит под номером bit в числе value

 

разве из названия макроса не очевидно. что чтение будет ПОБИТОВОЕ, а не побайтное?

ну и потом, ТС в итоге остановился на варианте через строку, а не через число...

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

b707 пишет:

разве из названия макроса не очевидно. что чтение будет ПОБИТОВОЕ, а не побайтное?

ну и потом, ТС в итоге остановился на варианте через строку, а не через число...

Это опИска, уже исправил ))

Да дело его, но можно было проще

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

v258 пишет:

Да дело его, но можно было проще

"проще" - понятие относительное. :) ТС, похоже, не отличиает битов от байтов... поэтому я считаю, что "проще" оставить как есть. чем пытаться обьяснить ему другой путь :)

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

b707 пишет:

"проще" - понятие относительное. :) ТС, похоже, не отличиает битов от байтов...

Вот и я, его почитавши, сам описАлся ))

FoxJone
Offline
Зарегистрирован: 19.04.2019

v258 пишет:

b707 пишет:

разве из названия макроса не очевидно. что чтение будет ПОБИТОВОЕ, а не побайтное?

ну и потом, ТС в итоге остановился на варианте через строку, а не через число...

Это опИска, уже исправил ))

Да дело его, но можно было проще

Во-первых, он получает с get-запроса строку, а не число.

В принципе, можно было в ЕСПшке эту строку конвертнуть в число, потом в атмеге это число читать побитово... Что это даст? На мой взгляд, кроме сокращения посылок между есп и атмегой - никакой другой выгоды нет.

А учитывая, сколько новых знаний ТСу надо будет выкурить для этого - овчинка выделки не стоит...

Вот проверку передачи между ЕСП и атмегой (хотя бы элементарной однобайтовой суммой, про СРС и не заикаюсь) я бы сделал. Малейшее искажение и не тот пин включится.