UART на Arduino Uno проблема с приемом данных

AVR версия программы

UART на Arduino Uno проблема с приемом данных

Сообщение lexx_l (lexx_l) » 16 фев 2021, 11:31

Здравствуйте, прошу помочь разобраться со следующей проблемой. Первый раз решил попробовать применить UART и вот засада... :hlp:
Состав проекта: ардуино уно, LCD1602, MH-Z19c - датчик со2, преобразователь уровней ттл, логический анализатор
Задача - посылаем в юарт следующий пакет: 0xff 0x01 0x86 0x00 0x00 0x00 0x00 0x00 0x79. В ответ ожидаем 0xff 0x86 0x?? 0x?? 0x00 0x00 0x00 0x00 0xcheksumm. Где ?? - данные содержащие полезную информацию о концентрации со2
Проблема: отсылаю данные, в ответ получаю 0xff 0x86 0xff 0xff 0xff 0xff 0xff 0xff 0xff - хотя на логическом анализаторе подключенном параллельно ардуинке я вижу нормальный и ожидаемый пакет данных. Проблема в том что первый и второй байт то что нужно, а дальше не то. Тоесть проблема програмная.
В си++ я почти ноль, поэтому и пользую флокод, с юартом столкнулся впервые. Пробовал и на восьмой и на пятой версии флокода - разницы нет.
Что я делаю не так? :headbang:
У вас нет доступа для просмотра вложений в этом сообщении.
Ник: lexx_l
Имя: lexx_l
(днепропетровск)
Заинтересованный
Заинтересованный
Информация о пользователе

Re: UART на Arduino Uno проблема с приемом данных

Сообщение Yushik (Андрей) » 16 фев 2021, 11:55

Здравствуйте
1. Сделайте файл протеуса пожалуйста, попробуем вам помочь.
2. В цикле файлы по UART читаются очень плохо (из личного опыта), я читал их по прерываниям. Всё прекрасно без потерь читалось (проверено в железе), правда проекты делал в 5 версии.
Аватар пользователя
Ник: Yushik
Имя: Андрей
(Симферополь)
Гуру
Гуру
Информация о пользователе

Re: UART на Arduino Uno проблема с приемом данных

Сообщение lexx_l (lexx_l) » 16 фев 2021, 12:01

Переделал ту же прогу но в пятой версии и сделал протеус
У вас нет доступа для просмотра вложений в этом сообщении.
Ник: lexx_l
Имя: lexx_l
(днепропетровск)
Заинтересованный
Заинтересованный
Информация о пользователе
Вернуться наверх

Re: UART на Arduino Uno проблема с приемом данных

Сообщение Yushik (Андрей) » 17 фев 2021, 19:22

Здравствуйте сейчас согласно файлу протеуса я вижу что вы только отсылаете данные, а принимать в этой схеме он будет только значения 0xFF. Поскольку у людей на форуме железа которое выдаёт байты нету, в этом случае есть два пути сделать в одном файле протеуса два контроллера один который будет выдавать нужные байты на ножку PD1/TXD, а второй будет принимать эти данные на ножку PD0/RXD (соответственно нужно делать два проекта в ФК), на анализаторе подключается только вход RXD Второй путь замкнуть (в файле протеуса) ножки PD0 и PD1 тогда контроллер должен принимать свои данные которые он выдает в PD1/TXD. Но скорее всего как я писал выше, уверенного приёма не получиться его надо осуществлять через прерывания, я сделал второй вариант в протеусе естественно приёма байтов не получилось. Потом зачем на дисплее ставить пробелы когда для этого есть команда позиции курсора, также изучите что такое файл прошивок elf и cof и как с ним работать в протеусе. Ниже я дал вам одну подсказку как это сделать в прерываниях, также замените файлы в ФК с этой viewtopic.php?f=15&t=3349&p=34839&hilit=исправление+косяков+в+фк#p34839 страницы но помните чтобы принимать в прерываниях сообщение из нескольких байтов нужно организовать счётчик длины сообщения и его сброс.
У вас нет доступа для просмотра вложений в этом сообщении.
Аватар пользователя
Ник: Yushik
Имя: Андрей
(Симферополь)
Гуру
Гуру
Информация о пользователе
Вернуться наверх

Re: UART на Arduino Uno проблема с приемом данных

Сообщение Enigm (Enigm) » 17 фев 2021, 22:08

На счет корректного приема пакета по байтно.
Для этого в протоколе нужно предусмотреть заголовок, поймав его мы понимаем что это начало пакета.
Если длина пакетов не фиксированная, то после заголовка, ставим количество байт полезной инфы.
Ну и в конце пакета. желательно слать контрольную сумму полезных байтов.
Лично я делаю так, и проблем нету.
Можно и по другому.
Если пакеты шлются не очень часто.
В пиках можно использовать прерывание по IDLE.
В АВР вроде этого нету.
То можно окончание приема ловить по времени.
Например
начали прием и в прерывании сбрасываем таймер времени, и если он переполнился на нужное время, значит прием окончен и считываем данные с буфера.
Недостатки такого способа такие.
Если пакеты шлются и мы включаем устройство, то мы можем начать ловить пакет не с начала, а с середины, тем самым получим неправильный пакет.
Решается просто, после включения первый принятый пакет игнорируем.
И второй недостаток, если время между пакетами маленькое, или идет сплошным потоком, то отловить конец пакета будет очень сложно и не стабильно или невозможно.
Тут решение первый вариант с заголовком и прочем.
Аватар пользователя
Ник: Enigm
Имя: Enigm
(Сочи)
Гуру
Гуру
Информация о пользователе
Вернуться наверх

Re: UART на Arduino Uno проблема с приемом данных

Сообщение Enigm (Enigm) » 17 фев 2021, 22:17

В протеусе можно использовать компонент сериал порт и к нему подключать контроллер.
А на компе ставим прогу Virtual Serial Port Driver и создаем пару виртуальных портов.
Пользуется просто.
Например создали пару из 2 и 3 ком порта.
В протеусе настраиваем компонент сериал порт например на 2 ком порт
Запускаем ннапример свою написанную прогу для девайса или какуенить терминальную прогу, я пользую Terminal
и выбираем 3 ком порт.
Все можно с проги слать данные в протеус и получать с протеуса данные.
Аватар пользователя
Ник: Enigm
Имя: Enigm
(Сочи)
Гуру
Гуру
Информация о пользователе
Вернуться наверх

Re: UART на Arduino Uno проблема с приемом данных

Сообщение Вячеслав (Вячеслав) » 18 фев 2021, 06:09

lexx_l писал(а):Переделал ту же прогу но в пятой версии и сделал протеус

Добрый день. Не знаю, насколько поможет эта информация. Для начального разбирательства.
UART_AVR-справка.rar
У вас нет доступа для просмотра вложений в этом сообщении.
Аватар пользователя
Ник: Вячеслав
Имя: Вячеслав
(Саратов)
Супер разработчик
Супер разработчик
Информация о пользователе
Вернуться наверх

Re: UART на Arduino Uno проблема с приемом данных

Сообщение lexx_l (lexx_l) » 18 фев 2021, 07:25

Всем откликнувшимся огромное спасибо. Я был уверен что это я гдето туплю, а оказывается (сложилось такое впечатление) что это все таки коряво во флоукоде этот момент сделан.
Ник: lexx_l
Имя: lexx_l
(днепропетровск)
Заинтересованный
Заинтересованный
Информация о пользователе
Вернуться наверх

Re: UART на Arduino Uno проблема с приемом данных

Сообщение Yushik (Андрей) » 18 фев 2021, 07:40

Здравствуйте дело не во флоукоде, они дали только азы, кубики которые они нам дали не перекрывают и половины возможностей МК. Остальное нужно изучать самим ФК может откомпилировать даже если проект будет написан полностью на СИ вставках. В примере что я дал выше я заменил МК на Atmega328P, потому-что под стоявший там Arduino Uno Smd коряво компилировалось и пример просто зависал в протеусе, не знаю может файл Arduino_Uno_Smd.fcd кривой. Я для любых Arduino Uno, ставлю в ФК Atmega328P пока всё нормально работает.
Аватар пользователя
Ник: Yushik
Имя: Андрей
(Симферополь)
Гуру
Гуру
Информация о пользователе
Вернуться наверх

Re: UART на Arduino Uno проблема с приемом данных

Сообщение mim (mim) » 18 фев 2021, 07:58

lexx_l писал(а):Я был уверен что это я гдето туплю

Абсолютно верно... За твои 6 лет на форуме уже наверное можно было-бы прочитать хотябы Help (про примеры форума с приемом по прерыванию я молчу) для компонента RS232.
Таким образом, изучив и поняв что такое за параметр nTimeout, можно принять весь пакет без ошибок даже с такой "кривой" реализацией как в твоем примере.

Так что же определяет nTimeout? Для чего он нужен?
I Am Legend
Аватар пользователя
Ник: mim
Имя: mim
(Из Лесу, вестимо...)
Легенда
Легенда
Информация о пользователе
Вернуться наверх

След.

Вернуться в Flowcode AVR

Кто сейчас на форуме

Пользователь просматривает форум: нет зарегистрированных пользователей