Обмен данными через последовательный порт
- Войдите на сайт для отправки комментариев
Втр, 12/02/2019 - 12:52
Ещё вчера вечером описал проблему в другой теме, на неё даже ответил DetSimen (судя по подписке на почте), но сейчас там всё подтёрто. Создаю новую тему:
Есть задача отправлять информацию через последовательный порт с Arduino UNO на ESP8266.
Вот кусок кода на передающей стороне (Arduino):
void loop() { Serial.print("
Ещё вчера вечером описал проблему в другой теме, на неё даже ответил DetSimen (судя по подписке на почте), но сейчас там всё подтёрто. Создаю новую тему:
Есть задача отправлять информацию через последовательный порт с Arduino UNO на ESP8266.
Вот кусок кода на передающей стороне (Arduino):
и что не работает? Должен же стопудово работать, если двойную кавычку поставить, потом закрывающую скопку, потом точку с запятой, потом фигурную. И всё.
Не могу понять, почему все мои ссобщения режутся, вот полный текст: http://text.fancy.kz/zxzq
Не могу понять, почему все мои ссобщения режутся, вот полный текст: http://text.fancy.kz/zxzq
Ты чо думаешь, там текста больше?
видимо, в кавычках первым символом идёть ^Z
Там был смайлик "градусник", для наглядности в боте. Не подумал, что он может вызвать какие-то проблемы
а вот это
// Serial.print(t);
ни о чем не?
И другие строчки тоже так, далее по тексту
Я просто вырвал кусок из девайса, который уже работает и залил в тестовую ардуину, чтобы понять как оно вообще функционирует. Ну и закомментил ненужные строки
Пацкаска: Что означает двойной слэш (//) перед Serial?
Я не настолько новичок) У меня дуина передаёт семь строк, а в итоге две с половиной. Это проблема
Передатчик фигачит с максимально возможной скоростью, а на приёмнике зачем-то задержка стоит после каждого символа. Не смущает? Буфер передатчика переполняется и он перестаёт передавать. Попробуйте вызывать flush после каждого println
Ну или прочитай себе вслух вэт это
https://ravesli.com/urok-9-kommentarii-v-s/
и снова приходи, нам расскажешь
Передатчик фигачит с максимально возможной скоростью, а на приёмнике зачем-то задержка стоит после каждого символа. Не смущает? Буфер передатчика переполняется и он перестаёт передавать. Попробуйте вызывать flush после каждого println
Спасибо за ответ. Сейчас открыл монитор порта на передатчике, он передаёт всё как и требуется. На всякий пожарный добавил flush, ничего не поменялось. Убрал задержку на приёмнике, ничего не поменялось(
На всякий пожарный добавил flush, ничего не поменялось. Убрал задержку на приёмнике, ничего не поменялось(
Куда добавил? Как добавил? Показывайте.
Куда добавил? Как добавил? Показывайте.
Сейчас через каждые две строки добавил delay(3000);
Стало приходить всё, но отдельными сообщениями соответственно:
Flush добавлял вот так:
Правда я сейчас вычитал, что она буфер-то чистила на версиях до 1. Но что с ней, что без неё в мониторе порта передатчика, повторюсь, всё прекрасно:
а что не так? Все что передеал все принято. В чем вопрос-то?
а что не так? Все что передеал все принято. В чем вопрос-то?
Если Вы про вариант с костыльными делеями по 3 секунды- то это всё-таки не то. Хочется одного целостного сообщения. А то, что в мониторе порта, только лишь выход передатчика.
Если не придумаем более красивой реализации, придётся пользоваться вариантом с делеями
Flush добавлял вот так:
Надо одновременно и добавить flush, и убрать все задержки из приёмника. Вот и покажите как это сделано и что при этом принимается.
В приёмника вообще не должно быть никаких задержек - никогда. Вы же не знаете когда и что будет передаваться.
Если не придумаем более красивой реализации, придётся пользоваться вариантом с делеями
Если не будете делать, что Вам говорят, то будете решать проблему сами :)
Надо одновременно и добавить flush, и убрать все задержки из приёмника. Вот и покажите как это сделано и что при этом принимается.
Я так и делал, но, вот:
Передатчик:
Приёмник:
Результат:
По- прежнему отсутсвуют четыре строки
Женя! Я вроде спрашивал, но ответ не помню: у тебя практика преподавания большая?
Это я к тому, что я твою методику наведения на самостоятельное решение не всегда могу понять.
Вот в этом случае, конкретно не могу.
Далее под спойлером, чтобы не портить процесс.
Автор, на твоей совести - не читать!
Это я к тому, что я твою методику наведения на самостоятельное решение не всегда могу понять.
За себя скажу. После чтения определенного объёма глупых вопросов и разбора скетчей-франкенштейнов мозг начинает выдавать такие же безумные конструктивы и отказывается видеть явные и простые ошибки.
Автор, на твоей совести - не читать!
Уж простите, не удержался. И поэтому спешу сообщить, что эту мысль я написал ещё в своём первом сообщении (!):
Думаю, может как-нибудь обозначить конец ввода? Заранее спасибо!
Тоесть я понимаю, что надо сделать так, но не очень понимаю как написать(
Тоесть я понимаю, что надо сделать так, но не очень понимаю как написать(
Ну блин!
Предай, как конец, какой-нибудь дурацкий символ.... например '#' или, как в С положено - '\n'.
И жди его появления, как принял его, не записывай в буфер, а переходи к передаче, вот и всё.
То есть ничего на приемнике не ждешь, понимаешь, что прием может не весь уложиться в один заход в loop().
При каждом заходе в loop() выгребаешь весь буфер приема и ждешь своего символа завершения.
Что тут может быть непонятного????
По- прежнему отсутсвуют четыре строки
А целиком приёмник показать слабо?
у него признака конца сообщения нет,
Это следующий вопрос. Пока пусть хоть просто наладит бридж - "что пришло, то и вышло"
А целиком приёмник показать слабо?
Вот, пожалуйста:
Сможете поставить печать переменной val перед строкой 58? Понимаю, что Serial занят, но если сможете, то поймёте проблему.
Кстати (совсем про другое), в строке №63 ошибка, раз в два месяца (при переходе millis через 0) будет сбоить. см. http://arduino.ru/forum/programmirovanie/velikoe-perepolnenie-millis
Сможете поставить печать переменной val перед строкой 58? Понимаю, что Serial занят, но если сможете, то поймёте проблему.
Переделал вот так, подключив передатчик в SoftwareSerial:
Текста стало ещё меньше:
То же самое, что и отпправляет в бот
Ох....
Ох....
Ну это всё ради вашего совета)
Хорошо, а если убрать пока байду с 72 по 81 строки? Никак не полегчает?
И кстати, софт сериал на таких скоростях не работает. Поставьте 9600 пока (и в передатчике тоже).
Ох....
Ну это всё ради вашего совета)
Прости, тут сейчас Женя рулит, пусть он и отдувается! (Женя! Прости меня, грешного!)
Про твою реплику могу только процитировать старую поговрку:
Дураку и грамота вредна.
В том смысле, что зря я влез... ты совсем не туда ушел, куда надо.
Хорошо, а если убрать пока байду с 72 по 81 строки? Никак не полегчает?
И кстати, софт сериал на таких скоростях не работает. Поставьте 9600 пока (и в передатчике тоже).
Убрал, от неё ни тепло, ни холодно. Поставил 9600, всё тот же обрубок текста
Что-то я чувствую, сейчас пойду напишу эти три несчастных дэлея, потому что я не особо понимаю, к чему всё это.
Убрал, от неё ни тепло, ни холодно. Поставил 9600, всё тот же обрубок текста
Ну, вот, уже не знаю. Ну, вывод-то из своих экспериментов сделайте! В какой-то момент Вы должны сделать выводы из той информации, что у Вас есть, понимаете. Именно так программы и отлаживают. Неужели, никакой вывод не напрашивается?
Вместо '#' - тот символ, который ты В ПЕРЕДАТЧИКЕ, МЛЯ, используешь, как конец сообщения.
Спасибо! Сначала выводились такие простыни каждые 3 минуты:
Но потом я снизил скорость, и всё заработало. Возможно, сделай я это раньше, было бы меньше проблем
Возможно, сделай я это раньше, было бы меньше проблем
Надеюсь, Вы о "подумать"? :)
------------------
wdrakula, признаю, что я облажался по уши :(
Надеюсь, Вы о "подумать"? :)
Зачем там думать - нужно было снизить скорость. А ещё прохфессорами назвались...
Возможно, сделай я это раньше, было бы меньше проблем
Надеюсь, Вы о "подумать"? :)
В совокупности)
wdrakula, признаю, что я облажался по уши :(
Женя! Ты о чём? Мне просто показалось, что ты ТС-а ведешь каким-то долгим путём, но "облажаться"??? Не понял тебя....
ТС! В строке 03 напиши
Обязательно это добавь, иначе попадешь на глюк. ;))))
Написал, но чёт не очень понимаю, зачем? Ведь мы в цикле сразу же присваиваем ему Serial.read();
Написал, но чёт не очень понимаю, зачем? Ведь мы в цикле сразу же присваиваем ему Serial.read();
"Не напрягайся, морщины появятся!" ;)
....
Ну сам подумай! Вот нет ничего в буфере, а старое значение в ch осталось и чо? Можно чистить при отправке, или до цикла. Как тебе больше нравиццо!
При отправке экономней на пару спичек.
Почему-то всё равно, даже на скорости 9600 может прийти не всё. Без пауз может прийти чуть-чуть, а с паузами в 3 секунды не приходит вообще ничего. Четыре сообщения на картинке отправляет одна и та же функция:
Приёмник:
спать нужно по ночам. всё завтра.
Женя! Ты о чём? Мне просто показалось, что ты ТС-а ведешь каким-то долгим путём, но "облажаться"??? Не понял тебя....
Как о чём, был уверен, что за пару тройку итераций доведу. Но не довёл.
ЧА что до длинного пути, так если бы у него сначала получилась копировалка длинной портянки, а потом уж ставить признак конца, то он бы понял проблему, а так ...
ТС, хотиите проверить поняли ли Вы проблему? Уберите оттуда while и добейтесь, чтобы без него также хорошо работало.
Нашего ТопикСтартера что-то не видать.... Ну ладно.
Вот вопросы к нему:
1.есть ли резон для того, чтобы все длинные тексты передавать с Уно? Вопрос в том, что на Уно памяти мало, а на ЕСП - неограниченно ;), может стоит передавать только значения?
2. Если пропажа строк сохраняется, то нужно синхронизировать передачу и прием. То есть передатчик кидает что-то, например '?' в приемник и ждет ответа. Получив ответ кидает уже данные, и ждет подтверждения получения.
Это можно выращивать до полноценного протокола обмена, или при ошибке просто повторять всё с начала. Тогда нужно завести запрос первого сообщения, запрос продолжения и запрос окончания. Приемник может отвечать только одним образом. При неответе - передатчик по таймауту вылетает и переходит в начало цикла.
Первый вопрос реализовал, но всё-таки кривовато. Зато работает на 100%. Пока что ни одного сбоя. Вот финальная версия на данный момент:
Передатчик (Уже основной девайс):
Приёмник:
Результат: