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

Использование протоколов Modbus, SPI, I2c и прочих, проблемы и решения
Ответить
Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 20
Откуда: Новосибирск

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

#1

Сообщение Слимпер » 28.02.2016{, 15:24}

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

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

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

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

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

Прилагаю код основного блока и пульта.
Вложения
9937496.rar
(110.84 КБ) 38 скачиваний
3926738.rar
(231.71 КБ) 39 скачиваний
Последний раз редактировалось Слимпер 28.02.2016{, 15:28}, всего редактировалось 1 раз.

Аватара пользователя
VirSpy
Рядовой
Сообщения: 62
Зарегистрирован: 03.12.2015{, 22:40}
Репутация: 3
Откуда: Минск, РБ

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

#2

Сообщение VirSpy » 28.02.2016{, 15:49}

Что-то мне подсказывает, что дело тут в компиляции проекта (порядок операторов в СиКоде не соответсвует порядку на платеИзображение

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 20
Откуда: Новосибирск

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

#3

Сообщение Слимпер » 17.03.2016{, 20:01}

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

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

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

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

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

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

 
Тестовый примеры
Вложения
6840702.flp
(72.91 КБ) 41 скачивание
6546062.flp
(144.61 КБ) 41 скачивание

Аватара пользователя
support
Супермодератор
Сообщения: 1384
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 468
Откуда: Астрахань
Имя: Сергей
Контактная информация:

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

#4

Сообщение support » 17.03.2016{, 20:10}

Насчёт модбаса. Я уже писал, и пока ситуация не изменилась что модбас мастер пока работает скажем так очень не хорошо. Слейвы работают прекрасно (в одном проекте ребята подняли сеть почти из сотни слейвов, мастером там компьютер со скадой), а вот мастер нормально не работает. я пока еще не решил эту проблему. Сейчас в свободное время изучаю поглубже протокол модбас. Хочу попробовать обойтись вообще без библиотек и реализовать мастера самостоятельно. Но это требует времени.
Автор программы FLProg.

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 20
Откуда: Новосибирск

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

#5

Сообщение Слимпер » 17.03.2016{, 20:32}

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

Аватара пользователя
Max
Лейтенант
Сообщения: 683
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 4
Откуда: Тюмень-Баку
Имя: Максим

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

#6

Сообщение Max » 17.03.2016{, 21:39}

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

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 20
Откуда: Новосибирск

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

#7

Сообщение Слимпер » 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 символов и все равно затыкается передача. 
Как уже писал выше вначале все нормально, а потом все нет приема данных.

Аватара пользователя
Max
Лейтенант
Сообщения: 683
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 4
Откуда: Тюмень-Баку
Имя: Максим

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

#8

Сообщение Max » 18.03.2016{, 07:35}

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

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 20
Откуда: Новосибирск

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

#9

Сообщение Слимпер » 18.03.2016{, 11:36}

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

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

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

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

Аватара пользователя
Max
Лейтенант
Сообщения: 683
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 4
Откуда: Тюмень-Баку
Имя: Максим

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

#10

Сообщение Max » 18.03.2016{, 12:03}

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

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 20
Откуда: Новосибирск

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

#11

Сообщение Слимпер » 18.03.2016{, 15:16}

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

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

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

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

Аватара пользователя
rw6cm
Полковник
Сообщения: 1608
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 120
Имя: Владимир

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

#12

Сообщение rw6cm » 18.03.2016{, 18:02}

Слимпер писал(а):Такое ощущение, что дело в алгоритме приема переменных.
Скорее в алгоритме передачи перменных
Вложения
7198691.flp
(149.96 КБ) 49 скачиваний
Win10-64, FLProg (portable)

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 20
Откуда: Новосибирск

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

#13

Сообщение Слимпер » 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

Аватара пользователя
rw6cm
Полковник
Сообщения: 1608
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 120
Имя: Владимир

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

#14

Сообщение rw6cm » 19.03.2016{, 10:40}

Думаю при передачи таких длинных текстовых пакетов о скорости придется забыть, и оперировать секундами.
Если бы это был числовой формат, то все ок, а с текстом всегда гемор.
Попробовал разгрузить ТХ и передавать раздельно, и частями, а собирать все на стороне RX.
Все равно, даже при секунде, видно как медленно это происходит.
Вложения
2868499.flp
(100.84 КБ) 44 скачивания
0766534.flp
(102.12 КБ) 40 скачиваний
Win10-64, FLProg (portable)

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 20
Откуда: Новосибирск

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

#15

Сообщение Слимпер » 19.03.2016{, 11:00}

Общий вывод, дело и правда скорей всего в буфере приёма. 

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

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

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

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

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

Naladchik
Сержант
Сообщения: 222
Зарегистрирован: 04.10.2015{, 19:10}
Репутация: 8
Откуда: Новосибирск
Имя: Павел

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

#16

Сообщение Naladchik » 19.03.2016{, 11:28}

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

Аватара пользователя
rw6cm
Полковник
Сообщения: 1608
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 120
Имя: Владимир

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

#17

Сообщение rw6cm » 19.03.2016{, 11:33}

Слимпер писал(а):Очень не хватало на блоке передачи переменой в UART входа send
Согласен! А на приеме "выхода Новые данные"
Сам об этом не однократно подумывал.
Win10-64, FLProg (portable)

vsheva
Рядовой
Сообщения: 13
Зарегистрирован: 07.01.2017{, 03:44}
Репутация: 0

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

#18

Сообщение vsheva » 08.01.2018{, 16:21}

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

Ответить

Вернуться в «Протоколы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость