FLProg
Вход на сайт
Логин:
Пароль:
Мы в VK
Поиск
Статистика


Яндекс.Метрика
Воскресенье, 04.12.2016, 17:13
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: support, Сергей 
Форум » Основной » Спросить у знатоков » Проблема с передачей данных через UART
Проблема с передачей данных через UART
Слимпер
Дата: Воскресенье, 28.02.2016, 15:24 | Сообщение # 1
Генерал-лейтенант
Группа: Проверенные
Сообщений: 664
Награды: 25
Репутация: 23
Статус: Offline
Немного предыстории.Решил сделать автоматику в теплицы на дачи (огурцы и помидоры ) полив там, проветривание , подогрев и может еще что
потом добавлю, для удобства дальнейшего развития системы, решил разделить её на
несколько блоков.

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

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

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

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

Прилагаю код основного блока и пульта.
Прикрепления: 3926738.rar(232Kb) · 9937496.rar(111Kb)


Сообщение отредактировал Слимпер - Воскресенье, 28.02.2016, 15:28
 
VirSpy Дата: Воскресенье, 28.02.2016, 15:49 | Сообщение # 2
Сержант
Группа: Проверенные
Сообщений: 55
Награды: 3
Репутация: 0
Статус: Offline
Что-то мне подсказывает, что дело тут в компиляции проекта (порядок операторов в СиКоде не соответсвует порядку на платеwink
 
Слимпер Дата: Четверг, 17.03.2016, 20:01 | Сообщение # 3
Генерал-лейтенант
Группа: Проверенные
Сообщений: 664
Награды: 25
Репутация: 23
Статус: Offline
Проблема так и не могу решить, уже экспериментирую по разному.
Что то с передачей строковых переменных большие проблемы.

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

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

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

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

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

 
Тестовый примеры
Прикрепления: 6546062.flp(145Kb) · 6840702.flp(73Kb)
 
support Дата: Четверг, 17.03.2016, 20:10 | Сообщение # 4
Автор программы
Группа: Администраторы
Сообщений: 579
Награды: 30
Репутация: 21
Статус: Offline
Насчёт модбаса. Я уже писал, и пока ситуация не изменилась что модбас мастер пока работает скажем так очень не хорошо. Слейвы работают прекрасно (в одном проекте ребята подняли сеть почти из сотни слейвов, мастером там компьютер со скадой), а вот мастер нормально не работает. я пока еще не решил эту проблему. Сейчас в свободное время изучаю поглубже протокол модбас. Хочу попробовать обойтись вообще без библиотек и реализовать мастера самостоятельно. Но это требует времени.

Разработчик программы FLProg
 
Слимпер Дата: Четверг, 17.03.2016, 20:32 | Сообщение # 5
Генерал-лейтенант
Группа: Проверенные
Сообщений: 664
Награды: 25
Репутация: 23
Статус: Offline
В том то и дело, что у меня глюки при работе UART (Modbus работает почти идеально, пока два слейва). Два контроллера соединены (UART аппаратный) проводками длинной 5см, и происходит то, что писал в предыдущем сообщении.

Сообщение отредактировал Слимпер - Четверг, 17.03.2016, 20:33
 
Max Дата: Четверг, 17.03.2016, 21:39 | Сообщение # 6
Гуру
Группа: Проверенные
Сообщений: 482
Награды: 14
Репутация: 4
Статус: Offline
Так может реализуете на блоке NRF, который сами и создали? В качестве эксперимента например...

Максим (VK - Максим Дунаевский)

Сообщение отредактировал Max - Четверг, 17.03.2016, 21:48
 
Слимпер Дата: Пятница, 18.03.2016, 06:29 | Сообщение # 7
Генерал-лейтенант
Группа: Проверенные
Сообщений: 664
Награды: 25
Репутация: 23
Статус: Offline
Цитата Max ()
Так может реализуете на блоке NRF, который сами и создали? В качестве эксперимента например...

Может я не понятно написал.
В железе это все уже сделано, это раз. Во вторых оба устройства собран в одном корпусе.

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

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

В примерах другие контролеры, так как когда обнаружил глюк, стал проверять уже на макетки.
Убрал все кроме передачи 2 строк из 16 символов и все равно затыкается передача. 
Как уже писал выше вначале все нормально, а потом все нет приема данных.
 
Max Дата: Пятница, 18.03.2016, 07:35 | Сообщение # 8
Гуру
Группа: Проверенные
Сообщений: 482
Награды: 14
Репутация: 4
Статус: Offline
Скорости передачи данных не пробовали менять?
Конечно бы схему посмотреть с расстояниями до модулей в схеме, питание проконтролировать... Я начал бы, так сказать от печки, когда у Вас все нормально работало, а потом по ступенчато подключал бы, естественно все на макетке.
Вообще, может все попробовать на ModBas сделать?
Да уж, не хватает поддержки протокола I2C...


Максим (VK - Максим Дунаевский)
 
Слимпер Дата: Пятница, 18.03.2016, 11:36 | Сообщение # 9
Генерал-лейтенант
Группа: Проверенные
Сообщений: 664
Награды: 25
Репутация: 23
Статус: Offline
Цитата Max ()
Скорости передачи данных не пробовали менять?

Пробовал, разницы не заметил.

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

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

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

Так как если мониторить Com- порт подключив UNO к компу, то вроде отправляются все пакеты без искажений.
 
Max Дата: Пятница, 18.03.2016, 12:03 | Сообщение # 10
Гуру
Группа: Проверенные
Сообщений: 482
Награды: 14
Репутация: 4
Статус: Offline
Т.е. Вы все по отключали, вернулись к исходному состоянию и опять не работает? У Вас же был момент, когда работало, хотя написали, что
Цитата Слимпер ()
все вроде было нормально, но как только подключил к основному блоку
то уже перестало работать...
Странно все это.


Максим (VK - Максим Дунаевский)

Сообщение отредактировал Max - Пятница, 18.03.2016, 12:35
 
Слимпер Дата: Пятница, 18.03.2016, 15:16 | Сообщение # 11
Генерал-лейтенант
Группа: Проверенные
Сообщений: 664
Награды: 25
Репутация: 23
Статус: Offline
Цитата Max ()
то уже перестало работать...Странно все это.
Ну это я тогда еще не понял, что глюк именно в передачи данных через Uart/

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

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

Я плохо знаю принцип работы Uart, но у меня возникает ощущение, что происходит то ли переполнение буфера приёма, то ли что то подобное. Это вывод я делаю из-за того что первые несколько десятков раз все проходит отлично, а потом приём затыкается (передача идёт нормально, суда по мониторингу Com-порта).
 
rw6cm Дата: Пятница, 18.03.2016, 18:02 | Сообщение # 12
Генерал-майор
Группа: Проверенные
Сообщений: 476
Награды: 43
Репутация: 31
Статус: Offline
Цитата Слимпер ()
Такое ощущение, что дело в алгоритме приема переменных.
Скорее в алгоритме передачи перменных
Прикрепления: 7198691.flp(150Kb)


PC, E8400, 3.5Gb, Win7-32, ver.FLP(portable)
 
Слимпер Дата: Пятница, 18.03.2016, 19:57 | Сообщение # 13
Генерал-лейтенант
Группа: Проверенные
Сообщений: 664
Награды: 25
Репутация: 23
Статус: Offline
Цитата rw6cm ()
Скорее в алгоритме передачи перменных
И правда так и правда с двумя переменными стабильно работает с интервалом передачи 500мс. А поменяли порядок, фактически порядок плат. 
Но если уменьшить интервал до 250мс или количество переменных до 4  снова та же проблема.

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

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

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

Сейчас Еще одну проверку сделал, добавил на стороне приемника вот это

То есть из одного порта (Com1) в дурой передаю (com2) 

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

6bbbbbbbbbbbb37ccccccccccccc48dddddddddddd110aaaaaaaaaaa211bbbbbbbbbbbb
312ccccccccccccc413dddddddddddd11aaaaaaaaaaaa216bbbbbbbbbbbb
17cccccccccccccc418ddddddddddd120aaaaaaaaaaaa221bbbbbbbbbbb

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

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

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

1256aaaaaaaaaaa2257bbbbb3258ccccc
Прикрепления: 0597395.png(5Kb)
 
rw6cm Дата: Суббота, 19.03.2016, 10:40 | Сообщение # 14
Генерал-майор
Группа: Проверенные
Сообщений: 476
Награды: 43
Репутация: 31
Статус: Offline
Думаю при передачи таких длинных текстовых пакетов о скорости придется забыть, и оперировать секундами.
Если бы это был числовой формат, то все ок, а с текстом всегда гемор.
Попробовал разгрузить ТХ и передавать раздельно, и частями, а собирать все на стороне RX.
Все равно, даже при секунде, видно как медленно это происходит.
Прикрепления: 0766534.flp(102Kb) · 2868499.flp(101Kb)


PC, E8400, 3.5Gb, Win7-32, ver.FLP(portable)
 
Слимпер Дата: Суббота, 19.03.2016, 11:00 | Сообщение # 15
Генерал-лейтенант
Группа: Проверенные
Сообщений: 664
Награды: 25
Репутация: 23
Статус: Offline
Общий вывод, дело и правда скорей всего в буфере приёма. 

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

Решил проблему  так
 


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

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

Добавлено (19.03.2016, 11:00)
---------------------------------------------

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

На реальной установки у меня подключены экраны не через I2C, а напрямую, по этому контроллер работает куда быстрее.
И того время паузы вышло 300мс, т.е. обновление одной строки где то раз в 1,5 секунды, что уже приемлемо.  smile
Прикрепления: 5471322.png(13Kb) · 9070659.png(14Kb)
 
Форум » Основной » Спросить у знатоков » Проблема с передачей данных через UART
Страница 1 из 212»
Поиск:

FLProg © 2016
Яндекс.Метрика