Проблема с передачей данных через UART
Проблема с передачей данных через UART
Немного предыстории.Решил сделать автоматику в теплицы на дачи (огурцы и помидоры ) полив там, проветривание , подогрев и может еще что
потом добавлю, для удобства дальнейшего развития системы, решил разделить её на
несколько блоков.
Основной – куда будет собираться данные с других блоков по Modbus Пуль – панель для вывода информации и управления Модули Вода/вывода – блоки в теплицах для измерения температуры и влажности и управления поливом проветриванием.Теперь суть проблемы.Если коротко то основной блок реализован на Arduino Mega2560 на UART1 поднят Modbus Master . На через Uart2 организована связь с пультом на который через четыре переменные типа String передаются данные которые надо вывести на экраны HD44780 и 2 переменные типа int какие светодиоды зажигать. А с пульта передаются коды нажатых клавиш.
Пока проверял только связь Основной блок – Пульт все вроде было нормально, но как только подключил к основному блоку еще и часы и поднял на нем Modbus Master данные на пульт стали приходить с перебоями.
Изначально передача переменных была по изменению, ну думаю ладно сделаем по времени. Ставлю передавать раз в секунду, и на тебе вообще почти
перестали обновляться (хотя иногда все же приходят, раз в 30с -2мин).
Может, кто подскажет в чем тут дело и как с этим бороться. А то на основном блоки еще даже не начал писать функционал, только связь проверил, а уже глуки.
Пока есть идея попробовать передавать переменные по очереди,но это все равно не даст гарантии передачи достоверных данных с основного модуля на пульт.
Прилагаю код основного блока и пульта.
потом добавлю, для удобства дальнейшего развития системы, решил разделить её на
несколько блоков.
Основной – куда будет собираться данные с других блоков по Modbus Пуль – панель для вывода информации и управления Модули Вода/вывода – блоки в теплицах для измерения температуры и влажности и управления поливом проветриванием.Теперь суть проблемы.Если коротко то основной блок реализован на Arduino Mega2560 на UART1 поднят Modbus Master . На через Uart2 организована связь с пультом на который через четыре переменные типа String передаются данные которые надо вывести на экраны HD44780 и 2 переменные типа int какие светодиоды зажигать. А с пульта передаются коды нажатых клавиш.
Пока проверял только связь Основной блок – Пульт все вроде было нормально, но как только подключил к основному блоку еще и часы и поднял на нем Modbus Master данные на пульт стали приходить с перебоями.
Изначально передача переменных была по изменению, ну думаю ладно сделаем по времени. Ставлю передавать раз в секунду, и на тебе вообще почти
перестали обновляться (хотя иногда все же приходят, раз в 30с -2мин).
Может, кто подскажет в чем тут дело и как с этим бороться. А то на основном блоки еще даже не начал писать функционал, только связь проверил, а уже глуки.
Пока есть идея попробовать передавать переменные по очереди,но это все равно не даст гарантии передачи достоверных данных с основного модуля на пульт.
Прилагаю код основного блока и пульта.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Слимпер 28 фев 2016, 15:28, всего редактировалось 1 раз.
Проблема с передачей данных через UART
Что-то мне подсказывает, что дело тут в компиляции проекта (порядок операторов в СиКоде не соответсвует порядку на плате) 

Проблема с передачей данных через UART
Проблема так и не могу решить, уже экспериментирую по разному.
Что то с передачей строковых переменных большие проблемы.
С одной(Arduino UNO) передаются по очереди две строковых переменных интервалом 500 мс.
На второй (Arduino Mega) принимает и выводит на экран.
Первые секунд 30-40 все одет отлично, на меге данные не приходят, потом через минуту опять несколько раз приходят, потом опять нет.
Если увеличить паузу между оправками до 1500мс, передача стабилизируются.
А если убрать чередование и передавать их одновременно, то данные доходят вообще раз в минуту и реже, и то в основном первая переменная.
Что с этим делать?
Больше всего меня смущает, что первые несколько оправок доходят нормально, а потом начинается чехарда.
Тестовый примеры
Что то с передачей строковых переменных большие проблемы.
С одной(Arduino UNO) передаются по очереди две строковых переменных интервалом 500 мс.
На второй (Arduino Mega) принимает и выводит на экран.
Первые секунд 30-40 все одет отлично, на меге данные не приходят, потом через минуту опять несколько раз приходят, потом опять нет.
Если увеличить паузу между оправками до 1500мс, передача стабилизируются.
А если убрать чередование и передавать их одновременно, то данные доходят вообще раз в минуту и реже, и то в основном первая переменная.
Что с этим делать?
Больше всего меня смущает, что первые несколько оправок доходят нормально, а потом начинается чехарда.
Тестовый примеры
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- support
- Супермодератор
- Сообщения: 1917
- Зарегистрирован: 03 янв 2018, 11:45
- Откуда: Астрахань
- Имя: Сергей
- Поблагодарили: 23 раза
- Контактная информация:
Проблема с передачей данных через UART
Насчёт модбаса. Я уже писал, и пока ситуация не изменилась что модбас мастер пока работает скажем так очень не хорошо. Слейвы работают прекрасно (в одном проекте ребята подняли сеть почти из сотни слейвов, мастером там компьютер со скадой), а вот мастер нормально не работает. я пока еще не решил эту проблему. Сейчас в свободное время изучаю поглубже протокол модбас. Хочу попробовать обойтись вообще без библиотек и реализовать мастера самостоятельно. Но это требует времени.
Автор программы FLProg.
Проблема с передачей данных через UART
В том то и дело, что у меня глюки при работе UART (Modbus работает почти идеально, пока два слейва). Два контроллера соединены (UART аппаратный) проводками длинной 5см, и происходит то, что писал в предыдущем сообщении.
Последний раз редактировалось Слимпер 17 мар 2016, 20:33, всего редактировалось 1 раз.
Проблема с передачей данных через UART
Так может реализуете на блоке NRF, который сами и создали? В качестве эксперимента например...
Последний раз редактировалось Max 17 мар 2016, 21:48, всего редактировалось 1 раз.
Проблема с передачей данных через UART
Может я не понятно написал.Max писал(а):Так может реализуете на блоке NRF, который сами и создали? В качестве эксперимента например...
В железе это все уже сделано, это раз. Во вторых оба устройства собран в одном корпусе.
Одно это пульт управления (Arduino ProMini), в составе двух экранов HD44780, 20 светодиодов, 15 кнопок.
Второе это как бы ЦП -ядро (Arduino Mega), в составе часов DS3231, nRF24L01+ (для передачи в блок в другое здание на котором хочу реализовать Web-сервер), max485 (для связи модулями ввод вывода, для сбора параметров и управления ИМ), ионистора (для сохранения таймеров отсчета при отключении питания).
Вот с ЦП на Пульт передавать 4 строки по 16 символов (дисплеи) и 2 int коды (светодиоды), а обратно 2 int (коды нажатых клавиш).
В примерах другие контролеры, так как когда обнаружил глюк, стал проверять уже на макетки.
Убрал все кроме передачи 2 строк из 16 символов и все равно затыкается передача.
Как уже писал выше вначале все нормально, а потом все нет приема данных.
Проблема с передачей данных через UART
Скорости передачи данных не пробовали менять?
Конечно бы схему посмотреть с расстояниями до модулей в схеме, питание проконтролировать... Я начал бы, так сказать от печки, когда у Вас все нормально работало, а потом по ступенчато подключал бы, естественно все на макетке.
Вообще, может все попробовать на ModBas сделать?
Да уж, не хватает поддержки протокола I2C...
Конечно бы схему посмотреть с расстояниями до модулей в схеме, питание проконтролировать... Я начал бы, так сказать от печки, когда у Вас все нормально работало, а потом по ступенчато подключал бы, естественно все на макетке.
Вообще, может все попробовать на ModBas сделать?
Да уж, не хватает поддержки протокола I2C...
Проблема с передачей данных через UART
Пробовал, разницы не заметил.Max писал(а):Скорости передачи данных не пробовали менять?
Как я уже писал на макетки оставил только две платы Aruino UNO и Arduino Mega, к ней подключен по HD44780, все соединено коротким проводками. Больше ни чего нет.Max писал(а):Я начал бы, так сказать от печки, когда у Вас все нормально работало, а потом по ступенчато подключал бы, естественно все на макетке.
В коде на тоже оставил только:
-UNO передача переменных
-Mega прием и вывод на экран.
Что в итоге наблюдаю описывал в 3 сообщении этой темы.
Такое ощущение, что дело в алгоритме приема переменных.
Так как если мониторить Com- порт подключив UNO к компу, то вроде отправляются все пакеты без искажений.
Проблема с передачей данных через UART
Т.е. Вы все по отключали, вернулись к исходному состоянию и опять не работает? У Вас же был момент, когда работало, хотя написали, что
Странно все это.
то уже перестало работать...Слимпер писал(а):все вроде было нормально, но как только подключил к основному блоку
Странно все это.
Последний раз редактировалось Max 18 мар 2016, 12:35, всего редактировалось 1 раз.
Проблема с передачей данных через UART
Ну это я тогда еще не понял, что глюк именно в передачи данных через Uart/Max писал(а):то уже перестало работать...Странно все это.
Первый раз когда проверял, проверял все по отдельности. Подключил экран, передал на него константу, она вывелась, ну значит работает, подключил светодиоды, проверил моргаю, значит все хорошо.
Передача и сейчас работает, если сделать паузу между отправкой переменных 1,5сек и больше, проблема почти незаметна, но обновление данных на экране раз в 8 секунд ( 4 строки текста и два числа) будет очень неудобно при работе с меню.
Я плохо знаю принцип работы Uart, но у меня возникает ощущение, что происходит то ли переполнение буфера приёма, то ли что то подобное. Это вывод я делаю из-за того что первые несколько десятков раз все проходит отлично, а потом приём затыкается (передача идёт нормально, суда по мониторингу Com-порта).
- rw6cm
- Полковник
- Сообщения: 2372
- Зарегистрирован: 06 сен 2015, 20:25
- Имя: Владимир
- Поблагодарили: 41 раз
Проблема с передачей данных через UART
Скорее в алгоритме передачи перменныхСлимпер писал(а):Такое ощущение, что дело в алгоритме приема переменных.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Win10-64, FLProg (portable)
Проблема с передачей данных через UART
И правда так и правда с двумя переменными стабильно работает с интервалом передачи 500мс. А поменяли порядок, фактически порядок плат.rw6cm писал(а):Скорее в алгоритме передачи перменных
Но если уменьшить интервал до 250мс или количество переменных до 4 снова та же проблема.
Я считаю, что дело в принимающем контроллере, сейчас еще одну вещь попробовал.
Подбираю интервал посылки при котором после запуска порядка десяти раз данные принимаются корректно, жду пока зависнет приём. Затем принимающий контроллер сбрасываю кнопкой RESET, опять порядка десяти раз приходит нормально. Притом по числу в начале строк видно, что пакеты идут по порядку. Сразу скажу что сам контроллер точно не завис, проверял.
Что еще интересно, скорость порта не как не влияет на этот эфект пробовал от 1920-115200.
Пробовал SoftWareSerial, история та же.
Сейчас Еще одну проверку сделал, добавил на стороне приемника вот это То есть из одного порта (Com1) в дурой передаю (com2)
Получил вначале все нормально
6bbbbbbbbbbbb37ccccccccccccc48dddddddddddd110aaaaaaaaaaa211bbbbbbbbbbbb
312ccccccccccccc413dddddddddddd11aaaaaaaaaaaa216bbbbbbbbbbbb
17cccccccccccccc418ddddddddddd120aaaaaaaaaaaa221bbbbbbbbbbb
Затем изображение на экране замирает а в пору вот что видно:
22cccccccccc423ddddd25aaaaaaaaaaaa226bbbbbbbbbb27cccccc428ddddd
Явно видно что пакеты не полные приходят
Перезагружаю конроллер:
1241aaaaaaaaaaaa2242bbbbbbbbbbb3243cccccccccccccc4243ddddddddddd
1246aaaaaaaaaaaa247bbbbbbbbbbbb3248ccccccccccccc4249dddddddddddd
1251aaaaaaaaaaa2252bbbbbbbbbbbb353cccccccccccc4254dddd
1256aaaaaaaaaaa2257bbbbb3258ccccc
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- rw6cm
- Полковник
- Сообщения: 2372
- Зарегистрирован: 06 сен 2015, 20:25
- Имя: Владимир
- Поблагодарили: 41 раз
Проблема с передачей данных через UART
Думаю при передачи таких длинных текстовых пакетов о скорости придется забыть, и оперировать секундами.
Если бы это был числовой формат, то все ок, а с текстом всегда гемор.
Попробовал разгрузить ТХ и передавать раздельно, и частями, а собирать все на стороне RX.
Все равно, даже при секунде, видно как медленно это происходит.
Если бы это был числовой формат, то все ок, а с текстом всегда гемор.
Попробовал разгрузить ТХ и передавать раздельно, и частями, а собирать все на стороне RX.
Все равно, даже при секунде, видно как медленно это происходит.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Win10-64, FLProg (portable)
Проблема с передачей данных через UART
Общий вывод, дело и правда скорей всего в буфере приёма.
Если принимающий контроллер успевает считать данные быстрее чем приходят новые, все работает нормально.
А вот если принимающий контроллер, считывает данные медленнее чем получает новые, постепенно заполняется буфер приёма, и при этом новые данные не входят и обрезаются.
А так как для корректного приёма необходим спец символ завершения строки, программа перестаёт принимать данные.
Решил проблему так Подобрал паузу экспериментальным путём, чтобы все работало корректно.
Очень не хватало на блоке передачи переменой в UART входа send (который есть в блоке Отправка в UART ). Из-за его отсутствия пришлось создать кучу дополнительных переменных.
Добавлено (19.03.2016, 11:00)
---------------------------------------------
На реальной установки у меня подключены экраны не через I2C, а напрямую, по этому контроллер работает куда быстрее.
И того время паузы вышло 300мс, т.е. обновление одной строки где то раз в 1,5 секунды, что уже приемлемо.
Если принимающий контроллер успевает считать данные быстрее чем приходят новые, все работает нормально.
А вот если принимающий контроллер, считывает данные медленнее чем получает новые, постепенно заполняется буфер приёма, и при этом новые данные не входят и обрезаются.
А так как для корректного приёма необходим спец символ завершения строки, программа перестаёт принимать данные.
Решил проблему так Подобрал паузу экспериментальным путём, чтобы все работало корректно.
Очень не хватало на блоке передачи переменой в UART входа send (который есть в блоке Отправка в UART ). Из-за его отсутствия пришлось создать кучу дополнительных переменных.
Добавлено (19.03.2016, 11:00)
---------------------------------------------
Пока писал свой пост вы ответил.rw6cm писал(а):Думаю при передачи таких длинных текстовых пакетов о скорости придется забыть, и оперировать секундами.
На реальной установки у меня подключены экраны не через I2C, а напрямую, по этому контроллер работает куда быстрее.
И того время паузы вышло 300мс, т.е. обновление одной строки где то раз в 1,5 секунды, что уже приемлемо.

У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Капитан
- Сообщения: 908
- Зарегистрирован: 04 окт 2015, 19:10
- Откуда: Новосибирск
- Имя: Павел
- Благодарил (а): 20 раз
- Поблагодарили: 22 раза
Проблема с передачей данных через UART
Зато там есть функция "Посылать при изменении" На вход блока передачи переменой в UART цепляете переменную, ну а в эту переменную пишите по разрешающему входу самой переменной. Костыль конечно, но будет то, что вы хотели.Слимпер писал(а):Очень не хватало на блоке передачи переменой в UART входа send (который есть в блоке Отправка в UART )
Последний раз редактировалось Naladchik 19 мар 2016, 11:29, всего редактировалось 1 раз.
- rw6cm
- Полковник
- Сообщения: 2372
- Зарегистрирован: 06 сен 2015, 20:25
- Имя: Владимир
- Поблагодарили: 41 раз
Проблема с передачей данных через UART
Согласен! А на приеме "выхода Новые данные"Слимпер писал(а):Очень не хватало на блоке передачи переменой в UART входа send
Сам об этом не однократно подумывал.
Win10-64, FLProg (portable)
Проблема с передачей данных через UART
Пытаюсь связать две меги , одна ch340 (на передаче выдает один импульс 10мс раз 1с и все ,на приеме всю строку в один символ (1602), символ меняется) ,другая на 16u2 выдает четкий пакет.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя