Официальный сайт компании Arduino по адресу arduino.cc
2 софт-сериала попеременно (Leo или UNO)
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пнд, 12/11/2018 - 20:58
Здравствуйте
Подскажите, есть ли всё-таки возможность каким-то образом использовать два softserial по очереди на платах Leonardo или UNO?
Альтернативные библиотеки? Модифицированная родная библиотека? Какая-нибудь хитрость, позволяющая переключать между собой SS ?
Кажется, перепробовал уже все.
Заранее огромное спасибо
Здравствуйте
Подскажите, есть ли всё-таки возможность каким-то образом использовать два softserial по очереди на платах Leonardo или UNO?
Альтернативные библиотеки? Модифицированная родная библиотека? Какая-нибудь хитрость, позволяющая переключать между собой SS ?
Кажется, перепробовал уже все.
Заранее огромное спасибо
Не увидел аналога метода Serial.end(); возможно, SoftwareSerial.begin() переключает на заданный порт. Пробовали уже?
Пробовал. Увы, не переключает. Видимо инициализация происходит только в самом начале.
почему бы не взять плату с двумя-тремя сериалами? Например STM32F103 - по флешу, оперативке, тактовой частоте превосходит Уно в 4 -10 раз, при этом дешевле Уно чуть ли не вдвое
Увы, в рамках данного проекта не могу :(
А сложно ли реализовать работу UART в отдельной функции на GPIO? Без прерываний. Может кто-то так делал уже?
А сложно ли реализовать работу UART в отдельной функции на GPIO? Без прерываний.
Насколько по-очереди нужно? Часто/быстро менять надо их?
Я для периодических запусков по запросу не стесняюсь создавать объект и уничтожать прямо в функции, которая с UART работает. Сколько угодно софтсериалов получается. Softwire модифицировал таким образом, что специальная функция configure() просто выполняет часть begin() с переинициализацией входов/выходов.
Чтение состояний GPIO в цикле и расшифровка всего этого добра...
Чтение состояний GPIO в цикле и расшифровка всего этого добра...
все это ради того, чтоб плату нормальную не покупать? :)
Чтение состояний GPIO в цикле и расшифровка всего этого добра...
Какой толк от контроллера, если он кроме чтения и расшифровки входящей информации больше ничем не сможет заниматься?
Так он этим будет заниматься ровно то время, которое мне нужно. Это определенная стадия программы, секунд на 10-15.
Так он этим будет заниматься ровно то время, которое мне нужно. Это определенная стадия программы, секунд на 10-15.
А как Вы собираетесь контролировать эти 10-15 секунд? Боюсь, что прерывания (все!) придется отключить, т.е. millis() не будет.
А если удалять ненужный сериал совсем, деструктор не почистит?
Попробуйте и нам скажите.
Каким образом? SoftwareSerial.end() не помогает (кстати, он и не документирован, хотя компилятор не ругается).
Ну, вот так попробуйте что ли: swSerial.~SoftwareSerial()...
Не-а :(
Ну, не знаю, у меня работает всё. Создаю, уничтожаю.
А вы не могли бы скинуть код? Был бы очень признателен.
Мне не жалко. Всё в таком стиле:
Да нет, работать-то оно работает - компилятор не ругается. Вот только уничтожай - не уничтожай - два SS у меня не работают. Даже если с одного только отправляю, а со второго - только слушаю.
Подскажите - а будет ли работать такая схема:
SS - один, но RX приходит с одного устройства (его слушаю), а TX уходит на третье (туда отправляю)?
Ну так я спрашивал - вам как их надо? Вот по-очереди именно таким способом у меня опрашиваются разные датчики, висящие на своих softserial-ах.
А ежели вам они нужны в системе одновременно, то производителем рекомендована функция listen() для переключения между инстансами.
Будет, почему нет-то? Буфера разные у RX/TX. Главное - самому помнить, что куда и откуда. А то у вас вон уже второе куда-то пропало.
Вот не переключает. Не работают у меня SS попеременно. Закрываю (end), уничтожаю - без разницы.
Может это быть связано со следующими моментами?
1) Одно из устройств - esp8266, через делитель. В одиночном режиме все работает.
2) Это устройство шлет в uart постоянно, а не по запросу.
Могу только это подкинуть: https://forum.arduino.cc/index.php?topic=442387.0
Не думаю, что проблема связана именно с ESP.
Вы меня заинтриговали!
Посмотрел код.
Нормально там всё работоает в двумя, хоть с 10-ю объектами.
Значит, послле "begin" активен тот, который последним вызывал begin - он сидит на прерывании. Чтобы сменить активный объект, нужно вызвать метод listen() после этого вызова, активным станет тот, чей метод listen вызывался.
Просто посмотрите текст SoftwareSerial, там всё понятно.
Вот мой код. Он не работает с listen, без него, а также с вариантами уничтожения объектов.
Принимает от ss1 только один раз, после этого - затык.
Железо: Leo (точнее Iskra Neo), сверху - GPRS-шилд на SIM800, который работает по Serial1. И подключен Serial-USB.
Хотя голый Leo (без шилда) показывает тоже самое.
Neo у меня нет.
Могу завтра подготовить работающий пример на Uno, если интересно. Надо?
Очень интересно!
Буду оч благодарен!
Вот мой код. Он не работает с listen, без него, а также с вариантами уничтожения объектов.
Принимает от ss1 только один раз, после этого - затык.
Ну а ссылку из #25 чего не осилили? Там жеж в первом же ответе все разжевано. Нету даже одного полноценного uart на софт сириале. Оно впринципе не может одновременно работать на передачу и прием. Даже одно устройство. Те недоразумения где оно какбы работает - чисто диалоговые, гарантирующие что эти два процесса никогда не пересекутся. И то недообследованые недоразумения ;) А уж ежели "Это устройство шлет в uart постоянно, а не по запросу." - так вобще какой там софтсириал, он еще и основной цикл тормознет так что не пошевелится.
Ссылку 25 осилил ещё до этой ветки.
AltSoftSerial - странная штука. Жесткие ограничения по пинам.
NeoSWSerial - не работает с Leo (32u4). На гитхабе есть какие-то любительские корректировки, чтобы она работала с 32u4, но у меня так и не стало компилироваться.
Логически я не очень понимаю, почему нельзя переключаться с одного SS на другой, если я прибиваю предыдущий, открывая новый (на других пинах). Кто там чего в постоянном режиме шлет в SS, который закрыт - какая разница? Но по какому-то недоразумению SS нормально закрыть нельзя (или я столкнулся с ещё какими-то очень тонкими глюками).
Я не очень представляю внутреннее устройство этой библиотеки, но мне кажется, что такая упущенная возможность (прибить один SS, открыть второй, прибить второй, открыть первый) - какой-то маразм.
ivpo, SoftSerial в основном рассчитан на 328, у которого аппаратный - только единственный, зато на всех пинах есть pcint. На Меге, например, он уже не работает, т.к. у нее pcint - не на всех. Да, как-то и не очень нужно, ибо есть 4 аппаратных. А как на других контроллерах - надо смотреть по дэйташиту. Если на пине нет никакого прерывания, SoftSerial на нем не организовать.
Ну а если в общем - контроллер надо подбирать под задачу, а не наоборот. И SoftSerial - это в основном не рабочий инструмент, а отладочный, когда нужно с одним портом работать, а другой - использовать для отладки. Так что Вам совет: выбирайте контроллер с таким количеством аппаратных портов, которое Вам нужно, а о софтверном - забудьте.
Эх, согласен. Золотые слова :)
совет: выбирайте контроллер с таким количеством аппаратных портов, которое Вам нужно, а о софтверном - забудьте.
Эх, согласен. Золотые слова :)
а я еще в начале дискуссии это говорил....
Вот это нормально работает на UNO. Я только что проверил. В первый софтовый сериал постоянно шлются текстовые единицы ('1'), а во второй постоянно валятся двойки.
результат
У меня нет Iskra Neo, потому не обессудьте. Но обязательно проверьте так ли там распаяны порты как в леонардо. В леонардо RX софтсериала имеет право быть только на порте B (на пинах 8-11). У Вас, вроде всё так, но как пины с портами соответсвуют - совместимо с леонардо или нет - этого я не знаю.
использовать два softserial по очереди на платах Leonardo или UNO?
Альтернативные библиотеки?
Зачем альтернативные? Читаем строку №2 родного SoftSerial.h
Нормально она работает, если аккуратно listen переключать.
Спасибо огромное! Проверю у себя на Искре и на Уне.