Принять данные по UART2 и отобразить в мониторе UART1
- Войдите на сайт для отправки комментариев
Пт, 21/05/2021 - 18:11
Здравствуйте!
Помогите пожалуйста разобраться, на Arduino mega на порт2 (пин 18 и 19) идёт поток данных которые я хочу вывести на монитор с помощью порт1 (пин 0 и 1), но ничего не происходит...
#include <SoftwareSerial.h> SoftwareSerial mySerial1(0, 1); // RX,TX SoftwareSerial mySerial2(19, 18); // RX,TX void setup() { Serial.begin(4800); } void loop() { char data = mySerial2.read(); mySerial1.println(data); }
А что должно происходить? Что куда подключено? Что такое монитор? Зачем вам SoftSerial при таком количестве человеческих USART на меге? Да еще на тех же пинах? Убирайте SS, и будет вам щщастие. Только не забудьте железные USART стартануть как полагается
И еще момент, я бы не стал в лупе делать безусловный println чтобы не зафлудить монитор порта.
при объявлении больше одного экземпляра класса SoftwareSerial прием у них отваливается, хотя передача работает. Так что на Меге можно полноценно юзать 4 сериала плюс один программный сериал.
К порту 19, 18 (mySerial2) через конвертер RS485 to TTL подключен навигационный прибор, который с периодичностью примерно в одну секунду передаёт данные по протоколу NMEA. Это примерно вот такие строки ($IIMWD,,T,153,M,000.0,N,000.0,M*73). А порт 0, 1 (mySerial1) на сколько я понял привязан к USB Arduino mega и соответственно происходить должно то, что данные которые поступают на порт mySerial2 должны передаться на порт mySerial1, а далее через USB на компьютер к которому соединена Arduino и отображаться на такой программе как на пример Port Monitor. В будущем эти данные будут обрабатываться, переформатироваться и отображаться на дисплее, но в данный момент нет дисплея и хотелось бы как-то убедится, что доходит до контролера и в каком виде.
Поясните пожалуйста, что значит «Да еще на тех же пинах» и «Убирайте SS»
Я буквально несколько дней как занялся программированием Arduino, поэтому не судите строго.
Обе рекомендации сводятся к одному: забудьте о SoftSerial.
А какая альтернатива?
Поясните пожалуйста, что значит «Да еще на тех же пинах» и «Убирайте SS»
Вы пытаетесь организовать SoftwareSerial (SSдля краткости) на тех же пинах, на которых у меги предусмотрен АППАРАТНЫЙ usart сериал порт. Как вы думаете, это хорошая идея? SS - достаточно глючная штука и применяется от безысходности на контроллерах с одним и менее аппаратным USART. У меги ЧЕТЫРЕ аппаратных usart, что вполне достаточно для большинства бытовых задач. SS вам не нужен от слова совсем. И еще, изучите функции класса Serial, там много интересного для себя откроете. Например available(). И изучите внимательно распиновку того контроллера, который собираетесь подвергать пыткам))
А ещё , если создаёшь экземпляр
SoftSerial mySerial1;
То будь добр его инициализировать.
mySerial1.begin(9600);
А какая альтернатива?
Ну вы говорите забыть про SoftSerial, а какую библиотеку порекомендуете для моей задачи?
Для вашей задачи все библиотеки подключены по умолчанию. Если вы используете Mega256, то имеете несколько аппаратных UART.
Спасибо всем за советы, с uart более менее разобрался, но теперь возник новый вопрос с форматированием Serial.print
А если будет :
String("TWA:")+...
Так тоже пробовал, результат тот же..
Так тоже пробовал, результат тот же..
код покажите полностью
а если сначала собрать строку а потом вывести?
Тоже не получилось
DoDo - код полный бред. Вы приняли из Сериала один единсвенный символ и уже хотите, чтобы библиотека nmea извлекла вам из него аж 4 параметра?
Смешно
вам правильно сказали в #16 - сначала примите и обработайте всю строку, а потом выводите.
Может и бред, но каждый параметр по отдельности выводится на монитор и даже все вместе выводятся, проблемa появляется когда вставляю текст "TWA: "
выложите подключенные файлы
или дайте ссылку, откуда вы их скачали
DoDo - у вас как с английским?
Строчку 68 в файле nmea.h читали?
Тоесть нужно проверять если есть дата?
Тоесть нужно проверять если есть дата?
конечно. И появляются данные там далеко не с первым символом.
А пока флаг idataready() не истина - в параметрах либо ничего нет, либо мусор, не имеющий отношения к реальности. либо старые значения от предыдущего чтения Сериал
Спасибо за помощь!
Тоесть нужно проверять если есть дата?
конечно. И появляются данные там далеко не с первым символом.
А пока флаг idataready() не истина - в параметрах либо ничего нет, либо мусор, не имеющий отношения к реальности. либо старые значения от предыдущего чтения Сериал
Написал вот так, но результат тотже..
Попробуйте печатать каждый параметр по отдельности
Сейчас заметил, что если на миг разрывать и снова восстанавливать связь порта Serial1 во время приёма, либо нажимать кнопку ресет на ардуино то иногда появляется правильная строка
Подскажите пожалуйста как обновляется led matrix display, при включении выводит переменную disp1 на дисплей, но когда содержимое disp1 меняется на дисплее остаются старые данные...
код явно не полный
код явно не полный
Что вы имеете в виду?
скопируйте то, что вы выложили - и попробуйте скомпилировать. Только именно так, как я написал
Да вы правы 4 скобки не скопировались
по поводу матриц - уточните - картинка вообще не обновляется или новые данные накладываются на старые?
И второе - попробуйте параллельно с выводом на матрицу печатать данные в Монитор - тогда вы увидите, обновляются ли сами данные на самом деле или они почему-то просто не приходят с GPS
Картинка не обновляется вообще. Попробовал выводить на монитор и действительно не обновляется и там, а вот если закрыть монитор и снова открыть то данные уже правильные на текущий момент
Картинка не обновляется вообще. Попробовал выводить на монитор и действительно не обновляется и там, а вот если закрыть монитор и снова открыть то данные уже правильные на текущий момент
ну вот видите, проблема не в матрице. Вы как-то неверно читаете Сериал1. Вы уверены. что там скорость 4800?
Да проблема была в том что вывод на матрицу либо на сериал были подчинены if ( Serial1.available(), сейчас вынес за скобки и данные стали меняться, но теперь как Вы и говорили накладываются друг на друга
теперь как Вы и говорили накладываются друг на друга
делайте перед каждым новым выводом matrix.clearDisplay() или matrix.clearScreen() (не помню как точно - посмотрите в библиотеке)
Спасибо большое Вы очень помогли! В библиотеке нашёл только fillScreen, он очищает дисплей, но появилось мерцание матрицы и оно как то связано с приёмом данных. Я подключил осциллограф на Serial1 и видно, что пакет принимается одну секунду, потом пауза три секунды и так по кругу, так вот мерцание происходит в три секунды между приёмом пакетов потом на секунду приёма всё нормально итд...
не знаю, какое именно мерцание вы имеете в виду. Вообще в этой библиотеке есть баг, там в некоторых режимах пиксели начинают двоится, автор библиотеки перепутал порядок подачи сигналов Latch и Enable на сдвиговых регистрах. Но проявляется не всегда
выложите полный код, который получился
Оно появляется когда добавляю функцию matrix.fillScreen(0); и почемуто идёт в такт с uart1
вы зря вынесли вывод на матрицу наружу из блока
так вы очищаете матрицу при каждом проходе через loop() . даже если с GPS нет никаких новых данных.
Перенесите строчки 87-91 на строку 54
Тоже самое, только вернулась и старая проблема (не обновляется disp1)
Мне кажется что проблема fillScreen в том что он стирает все пиксели, а не только те которые не нужны в данный момент
Тоже самое, только вернулась и старая проблема (не обновляется disp1)
судя по всему, вы что-то не то сделали. Покажите код после изменений
ну вот, строчку 90-то тоже надо было перенести :) Вставьте ее перед
Вот :) но результат тотже