Помогите! Спасите! СОС! :) (SoftwareSerial, i2c, WiFiServer server(80))
- Войдите на сайт для отправки комментариев
Хотел сделать машинку на вай-фай управлении через веб сервер, но дополнительно надо подключить GPS геолокацию.
Имеется
Node MCU
Neo 6m gps
arduino micro
Суть проблемы..
Когда я напрямую подключал Neo 6m gps к Node MCU возникла проблема, что SoftwareSerial и WiFiServer server(80); не дружат. В зависимости того что первой запустилось то и работает. Если запустился Neo 6m gps и передает данные то на Node MCU перестают работать кнопки управление. Геолокация отображается, но кнопки не работают, если отключить Neo 6m ясным делом не работает геолокация, но работают кнопки.
Перелопатил гугл, дошёл до того что понял что WiFiServer server(80); и SoftwareSerial работают за одним и тем же принципом, но так как SoftwareSerial нормально может работать только 1 то и возникает проблема что работает то или другое. Точней за принципом если 1 модуль читает, то второй может только передавать.
Читал, читал. Дошел что есть i2c которое позволяет делать несколько подключений. Решил немного схитрить, подключил дополнительно arduino micro по i2c. Стал генерировать данные и передавать на Node MCU. Все работает, точней данные з arduino micro передаются на Node MCU и отображает их на Web Server, кнопки тоже работают. Казалось вот он финиш осталось подключить Neo 6m gps к GPS и все гуд. Но, нет эта c#$%^ Neo 6m gps как писал раньше работает по SoftwareSerial. И как оказалось этот SoftwareSerial тоже не дружит з i2c. Так как i2c должен сделать запрос, и получить ответ. От чего SoftwareSerial и Neo 6m gps висит. И опять или работает SoftwareSerial, или i2c.
Теперь вопрос есть ли способ Neo 6m gps по i2c или какой GPS купить что бы был норм и мог работать з i2c. Или как можно подружить SoftwareSerial и i2c. Пробувал даже в void loop() писать SoftwareSerial.begin и Wire.begin(8); что типа по очереди запускать то или другое нифига не работает.
Это код последние на чём я зашёл в тупик в void loop() там где // Gps , //exolot дальномер, //i2c. Работает или // Gps или //i2c
#include <TinyGPS++.h> #include <SoftwareSerial.h> /* This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object. It requires the use of SoftwareSerial, and assumes that you have a 4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx). */ static const int RXPin = 10, TXPin = 9; static const uint32_t GPSBaud = 9600; // The TinyGPS++ object TinyGPSPlus gps; // The serial connection to the GPS device SoftwareSerial ss(RXPin, TXPin); //i2c int timer; #include <Wire.h> bool marker1 = false, marker2= false; String value1,value2; String GPSlat,GPSlon; String strLat,strLon,strJsn; float Lat,Lon,Jsn; char cstrLat[16]; char cstrLon[16]; char cstrJsn[16]; //exolot #include <NewPing.h> #include <MedianFilter.h> #include <Wire.h> #include <MedianFilter.h> #define TRIGGER_PIN 12 // Arduino pin tied to trigger pin on the ultrasonic sensor. #define ECHO_PIN 11 // Arduino pin tied to echo pin on the ultrasonic sensor. #define MAX_DISTANCE 2000 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm. NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance. MedianFilter filter(31,0); void setup() { //gps ss.begin(GPSBaud); //i2c Wire.begin(8); /* задаем на шине i2c 8 адрес */ Wire.onReceive(receiveEvent); /* регистрируем полученное событие */ Wire.onRequest(requestEvent); /* регистрируем запрошенное событие */ Serial.begin(115200); /* открываем серийный порт для дебаггинга */ } void loop() { // Gps while (ss.available() > 0) if (gps.encode(ss.read())){ displayInfo(); strLat = String(gps.location.lat(), 6); //6 чисел после запятой strLon = String(gps.location.lng(), 6); } //exolot дальномер exolot(); //i2c delay(100); GPSlat = value1.substring(1); GPSlon = value2.substring(1); Serial.println("Lat =" + GPSlat); /* переходим на новую строку */ Serial.println("Lon =" + GPSlon); /* переходим на новую строку */ } // Функция для извлечения любых принимаемых данных от мастера на шину void receiveEvent() { value1 = ""; value2 = ""; while (0 <Wire.available()) { char i2c = Wire.read(); /* получаем байт как символ*/ if (i2c=='a') { marker1 = true; marker2 = false; } if (i2c=='b') { marker1 = false; marker2 = true; } if (marker1 == true) value1 += i2c; if (marker2 == true) value2 += i2c; } } // Функция для извлечения любых отправляемых данных от мастера на шину void requestEvent() { //Lat = random(1,1000); //strLat = String(Lat); strLat.toCharArray(cstrLat,16); Wire.write("a"); Wire.write(cstrLat); /* Отправляем "чар" */ //Serial.print(cstrLat); //Lon = random(1,1000); //strLon = String(Lon); strLon.toCharArray(cstrLon,16); Wire.write("b"); Wire.write(cstrLon); /* Отправляем "чар" */ //Serial.print(cstrLon); strJsn = String(Jsn); strJsn.toCharArray(cstrJsn,16); Wire.write("c"); Wire.write(cstrJsn); /* Отправляем "чар" */ Wire.write("z"); // Serial.println(cstrJsn); } //exolot void exolot() { for (int i=0; i <= 2; i++) { delay (5); unsigned int o,uS = sonar.ping(); // Send ping, get ping time in microseconds (uS). filter.in(uS); o = filter.out(); //Serial.print("Ping: "); //Serial.print( o / US_ROUNDTRIP_CM); // Convert ping time to distance in cm and print result (0 = outside set distance range) //Serial.println("cm"); Jsn = o / US_ROUNDTRIP_CM; } } void displayInfo() { Serial.print(F("Location: ")); if (gps.location.isValid()) { Serial.print(gps.location.lat(), 6); Serial.print(F(",")); Serial.print(gps.location.lng(), 6); } else { Serial.print(F("INVALID")); } Serial.print(F(" Date/Time: ")); if (gps.date.isValid()) { Serial.print(gps.date.month()); Serial.print(F("/")); Serial.print(gps.date.day()); Serial.print(F("/")); Serial.print(gps.date.year()); } else { Serial.print(F("INVALID")); } Serial.print(F(" ")); if (gps.time.isValid()) { if (gps.time.hour() < 10) Serial.print(F("0")); Serial.print(gps.time.hour()); Serial.print(F(":")); if (gps.time.minute() < 10) Serial.print(F("0")); Serial.print(gps.time.minute()); Serial.print(F(":")); if (gps.time.second() < 10) Serial.print(F("0")); Serial.print(gps.time.second()); Serial.print(F(".")); if (gps.time.centisecond() < 10) Serial.print(F("0")); Serial.print(gps.time.centisecond()); } else { Serial.print(F("INVALID")); } Serial.println(); }
Странно... по идеи через то что пост длинный 3 одинаковых темы получилось..
Надо было сначала светлодиодиком помигать.
Надо было сначала светлодиодиком помигать.
Ем..?
Надо было сначала светлодиодиком помигать.
Ем..?
Ну доешь и поморгай ;)
Поделюсь сокровенными знаниями. Ежели есть куча либ ардуиновских, совершенно рабочих по отдельности и реализующих все что хочется иметь в своем коде, то будучи включенными в код ни фига не заработает.
Предлагаешь написать собственную библиотеку? Тоже вариант. Если честно что-то такое в голе проскакивало что придётся с 0 создавать способ передачи данных. Есть еще варианты?
Есть еще варианты?
учиться учиться учиться
Пока история написания вами программы выглядит как поиски черной кошки в темноте...Я нифига не понял, зачем вам понадобился софтсериал на ЕСп
Предлагаешь написать собственную библиотеку? Тоже вариант.
Нет. Как раз не библиотеку. Просто напиши себе программу.
Есть еще варианты?
учиться учиться учиться
Пока история написания вами программы выглядит как поиски черной кошки в темноте...Я нифига не понял, зачем вам понадобился софтсериал на ЕСп
Потому что ДЖПС Нео 6м на И2С не работает. Он работает только через СофтСериал. Точней я информации как запустить Нео 6м по И2С не нашол. Так как СофтСериал делает передачу напрямую, а И2С надо указать порт. Через что получєаться что ДЖПС надо или прошивать, или хз.
Проблема в тому что, что все эти библиотеки как оказалось вместе не работают, и в режиме чтение-запись может работать только что-то одно.
Как я писал Софт Сериал через который работает ДЖПС и Вайфай-сервер не дают друг другу нормально работать. Так как Вай фай использует, тоже Софт сериал как основу на сколько я понял, ну или ее часть кода. А 2 Софт сериала одновременно работать не могут, нету такой возможности в библиотеках точней в Софт Сериал есть такая штука как СофтСериал.listen(). Что позволяет прерывать одно и работать з другим. Но на библиотеку ВайФая, listen() не распространяться, нету у него такой функции. Сам СофтСериал.listen() работает через жопу, так как время переключения ужасно большое.
А проблема в считывании данных з буфера. Они как бы накладываются друг на друга, или даже точней сказать занимают место друг у друга. Я могу ошибаться... но в своих экспериментах я сделал такой вывод. Так как другого объяснения почему у меня, данные не могут одновременно считывать з ДЖПС и ВайФая, или даже по очереди... у меня нет. Такое ощущения, что ДЖПС и Вайфай во время считывания, занимают одну и ту саму ячейку в памяти. Типа идет сначала считывания з ДЖПС они загоняют по индексах в первую ячейку и т.д, а потом идет считывание з Вайфая и оно перезаписывает поверх того что считал коллега. В результате данные отображаются только от одного модуля.
То же самое з СофтСерал и И2С. Принцип передачи другой. Но работа з буфером одна и та сама.. по моем понимании. Через что они оба работать не могут.
Через что и возникает проблема. Как узгодить считывание двоих похожих за принципом оброки данных, но одновременно разных модуля? Когда у них разные библиотеки, но похожие за принципом работы , я думаю что часть, где идет работа з буфером тупо скопирована друг у друга.
Вот такой коллапс, я б сказал даже бред получаться.
И что-то жопой начинаю чувствовать что придется делать свой способ передачи данных, для того что бы обойти этот бред.
Предлагаешь написать собственную библиотеку? Тоже вариант.
Нет. Как раз не библиотеку. Просто напиши себе программу.
Вот что-то начинает в голову приходить. Так как в этих библиотеках (по идеи) при роботе з буфером нет понятия это моё , а это коллеги и они работают тупо по индексах в памяти, через что тупо затирают то, что было раньше. То придётся что-то шаманить похоже на передачу двоичного кода (мерцающего светодиода). Так как что-то написать, на подобии библиотек по работе з GPS или Wifi точно не смогу. Остаеться светодиодик. Начинаю понимать что имел в виду автор первого сообщения. Могу и ошибаться...
почему не взял нормальный хардовый серийный порт народ спрашивал?
почему не взял нормальный хардовый серийный порт народ спрашивал?
Тот что 0, 1 ? Пытался что-то не получилось. Или у меня руки из жопы или GPS странный. Возможно первое. Ах б%:?*(.... кажись знаю почему. Ведь у меня серийный запущенный на 11520, а GPS больше 9600 не воспринимает. Спасибо... попробую еще раз
Хочу сказать всем спасибо! Теперь у меня есть идеи з чем надо поработать.
Теперь у меня есть идеи з чем надо поработать.
З чем Вас и поздравляем!
Проблема в тому что, что все эти библиотеки как оказалось вместе не работают, и в режиме чтение-запись может работать только что-то одно.
не, проблема не в этом. проблема в том, что некий Flidi, как оказалось, нифига не понимает, как этими библиотеками пользоваться.
Когда человек всерьез уверен, что любой модуль должен работать и по Сериал и по I2C ... и несет вский бред про "пересекающиеся буфера" и "общие ячейки памяти" - тут варианта только два. Либо долго-долго учиться, либо бросить это дело сразу.
Проблема в тому что, что все эти библиотеки как оказалось вместе не работают, и в режиме чтение-запись может работать только что-то одно.
не, проблема не в этом. проблема в том, что некий Flidi, как оказалось, нифига не понимает, как этими библиотеками пользоваться.
Когда человек всерьез уверен, что любой модуль должен работать и по Сериал и по I2C ... и несет вский бред про "пересекающиеся буфера" и "общие ячейки памяти" - тут варианта только два. Либо долго-долго учиться, либо бросить это дело сразу.
Извините за то что прокомментировал "ваше сообщение" в "моем топике". Где у меня склалась мысль, о том, что вы не совсем поняли суть проблемы, через что я пытался вам более детально ее описать, во всех аспектах как я ее вижу.
Где у меня склалась мысль, о том, что вы не совсем поняли суть проблемы, через что я пытался вам более детально ее описать, во всех аспектах как я ее вижу.
Ваше видение проблемы неверное, а Ваши рассуждения о необходимости писать свою библиотеку или специальный протокол - выглядят несколько смешно на фоне того, что вы абсолютно не разбираетесь в предмете. На самом деле никакой несовместимости модуля GPS и Вебсервера нет. Проблема решается в рамках существующих библиотек и решали ее до вас сотни людей. Вам просто стоило бы для начала сделать пару-тройку проектов попроще ("светодиодиками помигать" - как вам другой участник посоветовал) - и понять, как на микроконтроллере совместить несколько задач одновременно. Это не такая простая задача, как кажется и простым слиянием двух отдельных скетчей ее не решить.
Что я и пытался до вас донести. Видимо не получилось. А обижать вас цели у меня не было.
почему не взял нормальный хардовый серийный порт народ спрашивал?
Тот что 0, 1 ? Пытался что-то не получилось. Или у меня руки из жопы или GPS странный. Возможно первое. Ах б%:?*(.... кажись знаю почему. Ведь у меня серийный запущенный на 11520, а GPS больше 9600 не воспринимает. Спасибо... попробую еще раз
тут два варианта или запустить сериал на 9600 или перевести модуль на 115200 )))
Где у меня склалась мысль, о том, что вы не совсем поняли суть проблемы, через что я пытался вам более детально ее описать, во всех аспектах как я ее вижу.
Ваше видение проблемы неверное, а Ваши рассуждения о необходимости писать свою библиотеку или специальный протокол - выглядят несколько смешно на фоне того, что вы абсолютно не разбираетесь в предмете. На самом деле никакой несовместимости модуля GPS и Вебсервера нет. Проблема решается в рамках существующих библиотек и решали ее до вас сотни людей. Вам просто стоило бы для начала сделать пару-тройку проектов попроще ("светодиодиками помигать" - как вам другой участник посоветовал) - и понять, как на микроконтроллере совместить несколько задач одновременно. Это не такая простая задача, как кажется и простым слиянием двух отдельных скетчей ее не решить.
Что я и пытался до вас донести. Видимо не получилось. А обижать вас цели у меня не было.
Запустить веб сервер з геолокация действительно не проблема.
Это моя тема, по части Веб Сервер + GPS. Проблема в том что метод client.readStringUntil(inByte) который я знаю, для обработки нажатия кнопок перестает работать, точней в зависимости от того что я ставлю в приоритете, работает.
Мне сказали что стандартными методами то что я хочу сделать нельзя, точней функциями Ардуино. По этому я решил использовать хитрость, пошёл по не стандартному методе, использовал I2C и Ардуино микро, как посредника. Если в части веб сервера посредник хорошо справился, то в части GPS возникла похожая проблема.
От чего и возник вопрос.
Теперь вопрос есть ли способ Neo 6m gps по i2c или какой GPS купить что бы был норм и мог работать з i2c. Или как можно подружить SoftwareSerial и i2c. Пробувал даже в void loop() писать SoftwareSerial.begin и Wire.begin(8); что типа по очереди запускать то или другое нифига не работает.
То что функции из GPS мешают работать остальному или наоборот, я и так понял. Вопрос как это исправить. Для чего и нужна помощь, а точней хотя бы взгляд со стороны. В чём ошибка? Надо делать по очереди байтовое чтение из каждого устройства?
У меня кончились идеи до того когда зашёл сюда на форум.
идею с промежуточной ардуино выкиньте, она дает вам больше проблем, чем пользы. Выкладывайте скетч. где вы подключали GPS прямо к ЕСП
идею с промежуточной ардуино выкиньте, она дает вам больше проблем, чем пользы. Выкладывайте скетч. где вы подключали GPS прямо к ЕСП
Считать одновременно или поочереди з SoftSerial и client у меня не получается. В результате считывание происходить з чего-то одного иногда очень редко проскакивает и другое.
Считать одновременно или поочереди з SoftSerial и client у меня не получается.
Как я и думал, библиотеки к вашей проблеме отношения не имеют. Затык в кривом коде. Вы взяли два скетча - один ТОЛЬКО для веб, другой ТОЛЬКО для GPS - и просто слили их вместе. В результате пока у вас идут данные с GPS - вы не читаете клиента, а потом перескакиваете в клиент и зависаете в нем. Например, посмотрите на цикл while в строчках 223-226. Вы в курсе что он делает? - этот цикл тупо ждет, пока у client не появится подключения. И при этом не дает работать всей остальной программе.
Большинство контроллеров Ардуино - однозадачные. Это значит, что они не могут делать одновременно более одного дела. Но это не значит. что решить вашу задачу на ардуино невозможно. Чтобы выполнять два и больше задач разом - надо особым образом писать программу, чтобы контроллер постоянно переключался между задачами. В вашем случае - проверил быстренько GPS, получил с него строчку - тут же переключился в клиент, проверил подключение. Если нет нового - обратно в GPS. И так десятки раз в секунду.
Но для этого код нужно писать таким образом с самого начала. Все процедуры должны быть короткими и быстрымы, желательно без операторов delay и циклов while.
И из этого следует, что нельзя просто взять два готовых кода, каждый из которых делает что-то одно и слить - работать не будет. Ваш код просто так не исправить, его надо переписывать заново.
Считать одновременно или поочереди з SoftSerial и client у меня не получается.
Как я и думал, библиотеки к вашей проблеме отношения не имеют. Затык в кривом коде. Вы взяли два скетча - один ТОЛЬКО для веб, другой ТОЛЬКО для GPS - и тупо слили их вместе. В результате пока у вас идут данные с GPS - вы не читаете клиента, а потом перескакиваете в клиент и тупо зависаете в нем. Например, посмотрите на цикл while в строчках 223-226. Вы в курсе что он делает? - этот цикл тупо ждет, пока у client не появится подключения. И при этом не дает работать всей остальной программе.
Большинство контроллеров Ардуино - однозадачные. Это значит, что они не могут делать одновременно более одного дела. Но это не значит. что решить вашу задачу на ардуино невозможно. Чтобы выполнять два и больше задач разом - надо особым образом писать программу, чтобы контроллер постоянно переключался между задачами. В вашем случае - проверил быстренько GPS, получил с него строчку - тут же переключился в клиент, проверил подключение. Если нет нового - обратно в GPS. И так десятки раз в секунду.
Но для этого код нужно писать таким образом с самого начала. Все процедуры должны быть короткими и быстрымы, желательно без операторов delay и циклов while.
И из этого следует, что нельзя просто взять два готовых кода, каждый из которых делает что-то одно и слить - работать не будет. Ваш код просто так не исправить, его надо переписывать заново.
Если данных нет надо ждать
Вот блин начинаю вспоминать что там где ДЖПС
while
(SoftSerial.available() > 0) {
Я ставил
if
(SoftSerial.available() > 0) {
А вот об этом я забыл.
while (!client.available()) {
while (!client.available()) {
while (!client.available()) {
Спасибо!! Обязательно попробую.
while (!client.available()) {
Вот таким макаром
не хочу вас расстраивать, но инфа по приведенной ссылке опять не имеет ничего общего с вашими проблемами. Отключать софтсериал требуется в одном случае - когда их в скетче два и более. А у вас он - один, поэтому "тормозить" его не надо.
И уверяю вас, что Софтсериал и Webclient не могут конфликтовать, потому что работают на совершенно разных принципах. И оба они не влияют на работоспособность кнопок.
Я уже писал раньше - у вас нет в скетче аппаратных проблем и нет конфликта библиотек. Проблема в вашем коде.
Ну и как иллюстрация к предыдущему сообщению - строчки 93-95 и 175-177 - полный бред. Их надо обязательно выкинуть, особенно первое условие. Думаю. кстати, когда вы их удалите - ситуация с работой программы станет значительно лучше.
Попробуйте сами догадаться, почему они мешают, это не сложно. Не догадаетесь - завтра обьясню.
Ну и как иллюстрация к предыдущему сообщению - строчки 93-95 и 175-177 - полный бред. Их надо обязательно выкинуть, особенно первое условие. Думаю. кстати, когда вы их удалите - ситуация с работой программы станет значительно лучше.
Попробуйте сами догадаться, почему они мешают, это не сложно. Не догадаетесь - завтра обьясню.
Как я понимаю If з return запускают ардуино полностью по новому циклу void loop(), или я ошибаюсь ?
Буду очень благодарен разъяснению.
Дело в том если я убираю If з return клиентская часть перестает реагировать на кнопки, даже если я отправляю их, по десятку раз в секунду. Но, если я делаю на ПК скрипт который отправляет беспрерывно поток нажатий тогда есть реакция.
Логика без иф ретурн должна быть правильная, но она не работает. А логика з If з return не правильная, но в даном случае частично работает. Что я упускаю?
Я даже client.print изменил что бы оперативную памать освободить. Но оно не работает как должно. Что я упускаю?
return - это выход из процедуры. Как только он у вас срабатывает в лупе, тут луп и заканчивается. И МК просто останавливается. Естественно, ни на какие кнопки он реагировать уже не будет. До перезапуска
тут луп и заканчивается. И МК просто останавливается
с хрена ли?
Ну и как иллюстрация к предыдущему сообщению - строчки 93-95 и 175-177 - полный бред. Их надо обязательно выкинуть, особенно первое условие. Думаю. кстати, когда вы их удалите - ситуация с работой программы станет значительно лучше.
Попробуйте сами догадаться, почему они мешают, это не сложно. Не догадаетесь - завтра обьясню.
Кажись понять проблему логики. Но возник вопрос ...
тут луп и заканчивается. И МК просто останавливается
с хрена ли?
Ну, это ... типа ... "highly likely" :-)
Я бы сказал, даже не "просто останавливается", а начинает обратный отсчёт до взрыва и саморазрушения. Это "highly likely" такая защита, чтоб прошивку не взломали и не стырили.
Ещё double break combo можно применить в конце - штоп чип разломился напополам.
Во-во, какой-то дед сурьёзный сегодня
Во-во, какой-то дед сурьёзный сегодня
Любителей по тролить хватает...
Спасибо я немного разобрался в ошибке логики программы.
Но не могу понять..
if
(SoftSerial.available() > 0) {
088
for
(
int
j = 0; j <= 1; j++)
089
{
090
091
if
(gps.encode(SoftSerial.read()))
092
{
Вот здесь я поставил фор, что бы процедура считывания прошла 2 раза. Потому как з первого раза он не срабатывает как надо. Точней Иф срабатывает, процедура считывания проходит, но значения нулевые. Это через то что слишком быстро проходит программа чем считываются данные?
Нормально такое использование ? Или можно как-то поправить?
Нормально такое использование ? Или можно как-то поправить?
нет, конечно. Читать из Сериал нужно не 2 символа, а ровно столько, сколько там есть. Иначе один раз может оказаться, что их там было 20 и вы прочитали только начало, а другой - что там был всего один символ и второе чтение прочитало ерунду из космоса...
Flidi - вы не хотите книжки какие-то почитать? А то тыкаетесь как слепой котенок... Раз сами не угадывайте - значит надо учиться.
Нормально такое использование ? Или можно как-то поправить?
нет, конечно. Читать из Сериал нужно не 2 символа, а ровно столько, сколько там есть. Иначе один раз может оказаться, что их там было 20 и вы прочитали только начало, а другой - что там был всего один символ и второе чтение прочитало ерунду из космоса...
Flidi - вы не хотите книжки какие-то почитать? А то тыкаетесь как слепой котенок... Раз сами не угадывайте - значит надо учиться.
Gps без For по логике должен считывать все символы из SoftSerial после чего должен приступать к работе з веб сервером. Когда я поставил Фор разве он считывает два символа? А не один и тот же 2 раза? Я могу ошибаться... По этому и спросил что не так з логикой без фора?
Причина почему я поставил фор это потому что данные из SoftSerial приходят очень редко, по етому и подумал о том что бы считать символ дважды, так как паузу (delay) ставить не хочеться, так как вы сами говорили, что надо избегать пауз и циклов. Пустив считывания одного и того же символа дважды я избегаю паузы... первый раз символ возможно не успел записаться, а вторым разом считываю его наверняка? Я могу ошибаться. Хоча по идеи без фор считывание должно приходить всегда и в приоритете. Но почему без фора данные так плохо приходят?
Да и буду очень благодарен за решением проблемы, что могу выразить в денежном эквиваленте. И да буду благодарен за рекомендацию о книги которую можно почитать. Я и так стараюсь читать форумы и статьи, книгам не особо доверяю. Так как мне не раз приходилось сталкиваться з старой инфой где, то не работает, то не так надо теперь использовать и т.д. и т.п. Очень много примеров от первых версий ардуино не работают.
Gps без For по логике должен считывать все символы из SoftSerial после чего должен приступать к работе з веб сервером. Когда я поставил Фор разве он считывает два символа? А не один и тот же 2 раза?
Вы можете читать из Сериал сколько угодно раз, независимо от того, есть там реальные данные или нет. Никаких ошибок в программе от этого не будет. Но если данные есть - вы читаете данные, а если уже прочитали все и нового нет - то дальше читаете либо случайные числа, либо предустановленное число типа 255. В любом случае читать дважды в цикле For - бессмысленно и вредно, вместо данных вы получите неизвестно что. Читать Сериал нужно только тогда, когда Serial.availiable() больше нуля.
Что касается помощи - пробуйте, учитесь, готов и дальше помогать вам советами в форуме. Брать вашу работу как платный заказ сейчас возможности нет, все время занято. Возможно через неделю будет попроще. Если до тех пор не решите - обращайтесь.
Gps без For по логике должен считывать все символы из SoftSerial после чего должен приступать к работе з веб сервером. Когда я поставил Фор разве он считывает два символа? А не один и тот же 2 раза?
Вы можете читать из Сериал сколько угодно раз, независимо от того, есть там реальные данные или нет. Никаких ошибок в программе от этого не будет. Но если данные есть - вы читаете данные, а если уже прочитали все и нового нет - то дальше читаете либо случайные числа, либо предустановленное число типа 255. В любом случае читать дважды в цикле For - бессмысленно и вредно, вместо данных вы получите неизвестно что. Читать Сериал нужно только тогда, когда Serial.availiable() больше нуля.
Что касается помощи - пробуйте, учитесь, готов и дальше помогать вам советами в форуме. Брать вашу работу как платный заказ сейчас возможности нет, все время занято. Возможно через неделю будет попроще. Если до тех пор не решите - обращайтесь.
Спасибо. Кое-чего кажется я добился. Я вспомнил что в примерах GPS была умная пауза решил ее попробовать. Кажется что теперь все ок.
Вот куда я ее вставил.
А вот сама пауза
Как то так.
Ну если помогло...
не знаю, по-моему эта пауза вам ничего не дает. Она предназаначена для вставки в какие-то другие медленные процессы, чтобы эти процессы не тормозили вывод данных из GPS. Вставлять эту паузу в код чтения того самого GPS - "масло масляное"
не говоря уже о том, что подобный метод - вообще говоря "костыль", то есть неправильный подход к решению проблемы...
Ну если помогло...
не знаю, по-моему эта пауза вам ничего не дает. Она предназаначена для вставки в какие-то другие медленные процессы, чтобы эти процессы не тормозили вывод данных из GPS. Вставлять эту паузу в код чтения того самого GPS - "масло масляное"
не говоря уже о том, что подобный метод - вообще говоря "костыль", то есть неправильный подход к решению проблемы...
без масла масляного это типа кокто так?
Вам эта так называемая пауза вообще зачем ? (хотя зачем она автору этой функции я тоже представляю с трудом). В начале loop проверили есть ли байты в serial, если есть - считали сколько есть, все, дальше работаете с буфером, в который эти байты складываете.
Пробувал
Не читает он GPS, нет данных. Без паузы он почему-то не хочет работать. Может это быть через то что MCU быстрей GPS?
Я так понимаю пауза дает время на то что бы считать данные. Типа у тебя есть 100 млсек для того что бы получить данные если их нет, иди дале. Мне кажется что данные без паузы могут приходить в то время когда MCU занят другими делами, а до Софт сериал не дошел, таким образом он их пропускает, от чего постоянно попадает на 0 пакет данных.. типа так?