Страница 1 из 1

Проблема с передачей данных через UART

Добавлено: 28.02.2016{, 15:24}
Слимпер
Немного предыстории.Решил сделать автоматику в теплицы на дачи (огурцы и помидоры ) полив там, проветривание , подогрев и может еще что
потом добавлю, для удобства дальнейшего развития системы, решил разделить её на
несколько блоков.

Основной – куда будет собираться данные с других блоков по Modbus   Пуль – панель для вывода информации и управления Модули Вода/вывода – блоки в теплицах для измерения температуры и влажности и управления поливом проветриванием.Теперь суть проблемы.Если коротко то основной блок реализован на Arduino Mega2560   на  UART1 поднят Modbus Master . На через Uart2 организована связь с пультом на который через четыре переменные типа String передаются данные которые надо вывести на экраны HD44780 и 2 переменные типа int какие светодиоды зажигать.  А с пульта передаются коды нажатых клавиш.

Пока проверял только связь Основной блок – Пульт  все вроде было нормально, но как только подключил к основному блоку еще и часы и поднял на нем Modbus Master данные на пульт стали приходить с перебоями.

Изначально передача переменных была по изменению, ну думаю ладно сделаем по времени. Ставлю передавать раз в секунду, и на тебе вообще почти
перестали обновляться  (хотя иногда все же приходят, раз в 30с -2мин).

Может, кто подскажет в чем тут дело и как с этим бороться. А то на основном блоки еще даже не начал писать функционал, только связь проверил, а уже глуки.
Пока есть идея попробовать передавать переменные по очереди,но это все равно не даст гарантии передачи достоверных данных с основного модуля на пульт.

Прилагаю код основного блока и пульта.

Проблема с передачей данных через UART

Добавлено: 28.02.2016{, 15:49}
VirSpy
Что-то мне подсказывает, что дело тут в компиляции проекта (порядок операторов в СиКоде не соответсвует порядку на платеИзображение

Проблема с передачей данных через UART

Добавлено: 17.03.2016{, 20:01}
Слимпер
Проблема так и не могу решить, уже экспериментирую по разному.
Что то с передачей строковых переменных большие проблемы.

С одной(Arduino UNO) передаются по очереди две строковых переменных интервалом 500 мс.
На второй (Arduino Mega) принимает и выводит на экран.
Первые секунд 30-40 все одет отлично, на меге данные не приходят, потом через минуту опять несколько раз приходят, потом опять нет.

Если увеличить паузу между оправками до 1500мс, передача стабилизируются.

А если убрать чередование и передавать их одновременно, то данные доходят вообще раз в минуту и реже, и то в основном первая переменная.   

Что с этим делать?

Больше всего меня смущает, что первые несколько оправок доходят нормально, а потом начинается чехарда.    

 
Тестовый примеры

Проблема с передачей данных через UART

Добавлено: 17.03.2016{, 20:10}
support
Насчёт модбаса. Я уже писал, и пока ситуация не изменилась что модбас мастер пока работает скажем так очень не хорошо. Слейвы работают прекрасно (в одном проекте ребята подняли сеть почти из сотни слейвов, мастером там компьютер со скадой), а вот мастер нормально не работает. я пока еще не решил эту проблему. Сейчас в свободное время изучаю поглубже протокол модбас. Хочу попробовать обойтись вообще без библиотек и реализовать мастера самостоятельно. Но это требует времени.

Проблема с передачей данных через UART

Добавлено: 17.03.2016{, 20:32}
Слимпер
В том то и дело, что у меня глюки при работе UART (Modbus работает почти идеально, пока два слейва). Два контроллера соединены (UART аппаратный) проводками длинной 5см, и происходит то, что писал в предыдущем сообщении.

Проблема с передачей данных через UART

Добавлено: 17.03.2016{, 21:39}
Max
Так может реализуете на блоке NRF, который сами и создали? В качестве эксперимента например...

Проблема с передачей данных через UART

Добавлено: 18.03.2016{, 06:29}
Слимпер
Max писал(а):Так может реализуете на блоке NRF, который сами и создали? В качестве эксперимента например...
Может я не понятно написал.
В железе это все уже сделано, это раз. Во вторых оба устройства собран в одном корпусе.

Одно это пульт управления (Arduino ProMini), в составе двух экранов HD44780, 20 светодиодов, 15 кнопок. 
Второе это как бы ЦП -ядро (Arduino Mega), в составе часов DS3231, nRF24L01+ (для передачи в блок в другое здание на котором хочу реализовать Web-сервер), max485 (для связи модулями ввод вывода, для сбора параметров и управления ИМ), ионистора (для сохранения таймеров отсчета при отключении питания).

Вот с ЦП на Пульт передавать 4 строки по 16 символов (дисплеи) и 2 int коды (светодиоды), а обратно 2 int (коды нажатых клавиш).

В примерах другие контролеры, так как когда обнаружил глюк, стал проверять уже на макетки.
Убрал все кроме передачи 2 строк из 16 символов и все равно затыкается передача. 
Как уже писал выше вначале все нормально, а потом все нет приема данных.

Проблема с передачей данных через UART

Добавлено: 18.03.2016{, 07:35}
Max
Скорости передачи данных не пробовали менять?
Конечно бы схему посмотреть с расстояниями до модулей в схеме, питание проконтролировать... Я начал бы, так сказать от печки, когда у Вас все нормально работало, а потом по ступенчато подключал бы, естественно все на макетке.
Вообще, может все попробовать на ModBas сделать?
Да уж, не хватает поддержки протокола I2C...

Проблема с передачей данных через UART

Добавлено: 18.03.2016{, 11:36}
Слимпер
Max писал(а):Скорости передачи данных не пробовали менять?
Пробовал, разницы не заметил.
Max писал(а):Я начал бы, так сказать от печки, когда у Вас все нормально работало, а потом по ступенчато подключал бы, естественно все на макетке.
Как я уже писал на макетки оставил только две платы Aruino UNO и Arduino Mega, к ней подключен по HD44780, все соединено коротким проводками. Больше ни чего нет.
В коде на тоже оставил только: 
-UNO передача переменных
-Mega прием и вывод на экран. 

Что в итоге наблюдаю описывал в 3 сообщении этой темы.

Такое ощущение, что дело в алгоритме приема переменных.

Так как если мониторить Com- порт подключив UNO к компу, то вроде отправляются все пакеты без искажений.

Проблема с передачей данных через UART

Добавлено: 18.03.2016{, 12:03}
Max
Т.е. Вы все по отключали, вернулись к исходному состоянию и опять не работает? У Вас же был момент, когда работало, хотя написали, что
Слимпер писал(а):все вроде было нормально, но как только подключил к основному блоку
то уже перестало работать...
Странно все это.

Проблема с передачей данных через UART

Добавлено: 18.03.2016{, 15:16}
Слимпер
Max писал(а):то уже перестало работать...Странно все это.
Ну это я тогда еще не понял, что глюк именно в передачи данных через Uart/

Первый раз когда проверял, проверял все по отдельности. Подключил экран, передал на него константу, она вывелась, ну значит работает, подключил светодиоды, проверил моргаю, значит все хорошо.

Передача и сейчас работает, если сделать паузу между отправкой переменных 1,5сек и больше, проблема почти незаметна, но обновление данных на экране раз в 8 секунд ( 4 строки текста и два числа) будет очень неудобно при работе с меню.

Я плохо знаю принцип работы Uart, но у меня возникает ощущение, что происходит то ли переполнение буфера приёма, то ли что то подобное. Это вывод я делаю из-за того что первые несколько десятков раз все проходит отлично, а потом приём затыкается (передача идёт нормально, суда по мониторингу Com-порта).

Проблема с передачей данных через UART

Добавлено: 18.03.2016{, 18:02}
rw6cm
Слимпер писал(а):Такое ощущение, что дело в алгоритме приема переменных.
Скорее в алгоритме передачи перменных

Проблема с передачей данных через UART

Добавлено: 18.03.2016{, 19:57}
Слимпер
rw6cm писал(а):Скорее в алгоритме передачи перменных
И правда так и правда с двумя переменными стабильно работает с интервалом передачи 500мс. А поменяли порядок, фактически порядок плат. 
Но если уменьшить интервал до 250мс или количество переменных до 4  снова та же проблема.

Я считаю, что дело в принимающем контроллере, сейчас еще одну вещь попробовал.
Подбираю интервал посылки при котором после запуска порядка десяти раз данные принимаются корректно, жду пока зависнет приём. Затем принимающий контроллер сбрасываю  кнопкой  RESET,  опять порядка десяти раз приходит нормально. Притом по числу  в начале строк видно, что пакеты идут по порядку. Сразу скажу что сам контроллер точно не завис, проверял.

Что еще интересно, скорость порта не как не влияет на этот эфект пробовал от 1920-115200.  

Пробовал SoftWareSerial, история та же. 

Сейчас Еще одну проверку сделал, добавил на стороне приемника вот это
0597395.png
То есть из одного порта (Com1) в дурой передаю (com2) 

Получил вначале все нормально

6bbbbbbbbbbbb37ccccccccccccc48dddddddddddd110aaaaaaaaaaa211bbbbbbbbbbbb
312ccccccccccccc413dddddddddddd11aaaaaaaaaaaa216bbbbbbbbbbbb
17cccccccccccccc418ddddddddddd120aaaaaaaaaaaa221bbbbbbbbbbb

Затем изображение на экране замирает а в пору вот что видно:
22cccccccccc423ddddd25aaaaaaaaaaaa226bbbbbbbbbb27cccccc428ddddd

Явно видно что пакеты не полные приходят

Перезагружаю конроллер:
1241aaaaaaaaaaaa2242bbbbbbbbbbb3243cccccccccccccc4243ddddddddddd
1246aaaaaaaaaaaa247bbbbbbbbbbbb3248ccccccccccccc4249dddddddddddd
1251aaaaaaaaaaa2252bbbbbbbbbbbb353cccccccccccc4254dddd

1256aaaaaaaaaaa2257bbbbb3258ccccc

Проблема с передачей данных через UART

Добавлено: 19.03.2016{, 10:40}
rw6cm
Думаю при передачи таких длинных текстовых пакетов о скорости придется забыть, и оперировать секундами.
Если бы это был числовой формат, то все ок, а с текстом всегда гемор.
Попробовал разгрузить ТХ и передавать раздельно, и частями, а собирать все на стороне RX.
Все равно, даже при секунде, видно как медленно это происходит.

Проблема с передачей данных через UART

Добавлено: 19.03.2016{, 11:00}
Слимпер
Общий вывод, дело и правда скорей всего в буфере приёма. 

Если принимающий контроллер успевает считать данные быстрее чем приходят новые, все работает нормально.
А вот если  принимающий контроллер, считывает данные медленнее чем получает новые, постепенно заполняется буфер приёма, и при этом новые данные не входят и обрезаются.
 А так как для корректного приёма необходим спец символ завершения строки, программа перестаёт принимать данные.

Решил проблему  так
9070659.png
 
5471322.png
Подобрал паузу экспериментальным путём, чтобы все работало корректно. 

Очень не хватало на блоке передачи переменой в UART  входа send (который есть в блоке Отправка в UART ). Из-за его отсутствия пришлось создать кучу дополнительных переменных.

Добавлено (19.03.2016, 11:00)
---------------------------------------------
rw6cm писал(а):Думаю при передачи таких длинных текстовых пакетов о скорости придется забыть, и оперировать секундами.
Пока  писал свой пост вы ответил.

На реальной установки у меня подключены экраны не через I2C, а напрямую, по этому контроллер работает куда быстрее.
И того время паузы вышло 300мс, т.е. обновление одной строки где то раз в 1,5 секунды, что уже приемлемо.  Изображение

Проблема с передачей данных через UART

Добавлено: 19.03.2016{, 11:28}
Naladchik
Слимпер писал(а):Очень не хватало на блоке передачи переменой в UART  входа send (который есть в блоке Отправка в UART )
Зато там есть функция "Посылать при изменении"  На вход блока передачи переменой в UART цепляете переменную, ну а в эту переменную пишите по разрешающему входу самой переменной. Костыль конечно, но будет то, что вы хотели.

Проблема с передачей данных через UART

Добавлено: 19.03.2016{, 11:33}
rw6cm
Слимпер писал(а):Очень не хватало на блоке передачи переменой в UART входа send
Согласен! А на приеме "выхода Новые данные"
Сам об этом не однократно подумывал.

Проблема с передачей данных через UART

Добавлено: 08.01.2018{, 16:21}
vsheva
Пытаюсь связать две меги , одна ch340 (на передаче выдает один импульс 10мс раз 1с и все ,на приеме всю строку в один символ (1602), символ меняется) ,другая на 16u2 выдает четкий пакет.