обработка данных Serial
- Войдите на сайт для отправки комментариев
Втр, 07/07/2020 - 11:23
Здравствуйте! на борту esp8266 делает запрос на хостинг.. получает ответ вида 100111011-где любая цифра это состояние пина на ардуинке ..либо включен либо выключен
далее этот набор цифр принимает mega2560 в Serial3 .. собственно проблема в том как разбить этот набор цифр по одной..и записать в переменные..
1- pin24
0-pin25
0-pin26 ....
если делать запрос и получать одну цифру..проблем бы не было..но это очень много запросов.. поэтому хост выдает одной строкой состояние всех пинов ..
как разбить этот набор цифр по одной..и записать в переменные..
1- pin24
0-pin25
0-pin26 ....
Написать парсер входного кода и распихиватель по переменным.
да в этом то и проблема..
бьюсь 4й день..
ну так показывай, как бьёшься.
Это залито в 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); }это залито в ардуинке..принимаю из 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); } }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'Вы неправильно понимаете работу parseInt
Он ваш ТЕКСТ "100111011" воспринимает как одно число.
unsignedlongdata = Serial3.parseInt();А почему ты читаешь unsigned long, когда пишешь String? Да еще и функцией parseInt?
спасибо. просто это единственный способ которого я добился что бы корректно получить данные от esp8266
в мониторе порта ардуино.. а как эти 100111011 цифры разбить по одной.. заранее извиняюсь за некомпетентность.. я больше в php все время..только открываю мир контроллеров
если просто long то выводит не все цифры в строке...5 или 6 ... а parseInt() единственное что хоть как то правильно передает в порт
если просто принимать serial.read() прилетает что то типа 50 ...10 .. или 216...114... вместо 1000111000...
10101001 приходит строкой? У String есть метод, выдающий указатель на char[]. Указатель берите и бегите с ним, пока не встретите NULL. Каждый следующий символ - "состояние" пина.
Что-то вроде:
char* ptr = String.Тот_самый_метод(); while (*ptr != NULL) { // Можно заменить на switch() if (*ptr == '0') { выключил; } if (*ptr == '1') { включил; } if (*ptr == '2') { помигал; } ptr++; }Всем ОГРОМНОЕ СПАСИБО!!! вот код заработал.!!! 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); } }В Arduino.h есть макрос для побитового чтения числа
В Arduino.h есть макрос для побайтового чтения числа
разве из названия макроса не очевидно. что чтение будет ПОБИТОВОЕ, а не побайтное?
ну и потом, ТС в итоге остановился на варианте через строку, а не через число...
разве из названия макроса не очевидно. что чтение будет ПОБИТОВОЕ, а не побайтное?
ну и потом, ТС в итоге остановился на варианте через строку, а не через число...
Это опИска, уже исправил ))
Да дело его, но можно было проще
Да дело его, но можно было проще
"проще" - понятие относительное. :) ТС, похоже, не отличиает битов от байтов... поэтому я считаю, что "проще" оставить как есть. чем пытаться обьяснить ему другой путь :)
"проще" - понятие относительное. :) ТС, похоже, не отличиает битов от байтов...
Вот и я, его почитавши, сам описАлся ))
разве из названия макроса не очевидно. что чтение будет ПОБИТОВОЕ, а не побайтное?
ну и потом, ТС в итоге остановился на варианте через строку, а не через число...
Это опИска, уже исправил ))
Да дело его, но можно было проще
Во-первых, он получает с get-запроса строку, а не число.
В принципе, можно было в ЕСПшке эту строку конвертнуть в число, потом в атмеге это число читать побитово... Что это даст? На мой взгляд, кроме сокращения посылок между есп и атмегой - никакой другой выгоды нет.
А учитывая, сколько новых знаний ТСу надо будет выкурить для этого - овчинка выделки не стоит...
Вот проверку передачи между ЕСП и атмегой (хотя бы элементарной однобайтовой суммой, про СРС и не заикаюсь) я бы сделал. Малейшее искажение и не тот пин включится.