Как правильно обрабатывать строки из Serial?

Тема в разделе "Arduino & Shields", создана пользователем regent.correon, 4 дек 2018 в 07:52.

  1. AlexU

    AlexU Гуру

    Готовых решений на базе USART скорее нет, чем есть. И связано это с наличием RS485.
    Если уж так приспичило использовать именно USART, то придётся всё городить самому. По большому счёту ход Ваших мыслей правильный. Но нужно определится с форматом пакетов -- что бы можно было точно сказать, где начало, а где завершение пакета данных.
    И самое главное: надо внимательно посмотреть на схемотехнику -- как бы не получилось, что при начале передачи слейвом, не погорели все слейвы на шине. Дело в том, что в AVR'ках при простое передающий провод подтягивается к "плюсу", а при передаче '0' замыкается на "минус".
    PS: предыдущий автор немного опередил...
     
  2. На базе USART как раз есть возможность. В атмегах есть специальный режим, превращающий интерфейс USART в дополнительный SPI, есть специальные флаги для обработки адресных пакетов в USART. Собственно, режим девять бит на пакет для этого и есть. Но это всё совсем не то же самое, что сериал в ардуино.
     
  3. SergeiL

    SergeiL Гуру

    С точки зрения кода, в простейшем случае программной реализации, разница между USART и RS-485 только в переключении драйвера на передачу, потом на прием, в последнем. В USART этого нет, а так, код может быть идентичным.
     
  4. AlexU

    AlexU Гуру

    Вы не сообщили какими контроллерами пользуетесь. Но вот в документации для тех же ATmega328 -- Arduino UNO, Nano и т.п., в разделе про USART есть подраздел "20.9 Multi-processor Communication Mode". Который как раз и описывает как организовать сеть Master -> много Slave через USART. Вроде как адресация слейвов на аппаратном уровне поддерживается.
    И это косвенно говорит о том, что проблемы со сгоранием слейвов при передаче может не быть. Ключевое слово -- может...
     
  5. ostrov

    ostrov Гуру

    485 придумано и отработано сто сто лет назад, чего вымучивать?
     
    parovoZZ и Igor68 нравится это.
  6. По-моему тут проблема в возможности КЗ при конфликте уровней выходов. От возможности этого невозможно избавиться в принципе (против лома - нет приема). Так что тут только либо открытый коллектор на всех выходах, либо трансформаторная развязка как в эзернете. То есть затык в схемотехнике.
     
  7. SergeiL

    SergeiL Гуру

    А я так понимаю, что в случае Multi-processor Communication Mode все равно обязательно требуется драйвер для подключения к линии типа MAX485.
     
  8. SergeiL

    SergeiL Гуру

    А диод на каждый выход TX слейва, и один подтягивающий резистор на RX мастера не пойдет? :)
    А трансформаторная развязка здесь к чему? Тут обычный USART.
     
    Последнее редактирование: 7 дек 2018 в 14:20
  9. b707

    b707 Гуру

    мое мнение. что все это ТС нафик не нужно. Причина его "глубоких изысканий" в области master-slave UART - совсем не в желании замутить что-то крутое и новое, а в элементарном незнании существующих протоколов.
    Условно говоря, он лезет в гору не потому что альпинист, а потому что карту потерял :) или ее и не было у него...
     
    parovoZZ и Igor68 нравится это.
  10. DetSimen

    DetSimen Гуру

    Ну отчего же, вдруг он до арбитра RS232 шины дотрахаеца.
     
    parovoZZ и Igor68 нравится это.
  11. Igor68

    Igor68 Гуру

    По спецификации (смотрите вики):
    RS232 обязан выдерживать КЗ всех своих сигналов и уровни до 15 вольт. Следует учесть что имеется ввиду именно RS232 тот именно нормальный который выдаёт около +12 -12, а не те что сейчас +5 -5.
    А вообще-то есть для связи (именно для связи множества параллельно включенных устройств) RS485 и ещё RS422, который менее распространён и для TX и RX применены разные пары (TXmaster--->RXslave(s) и TXslave(s)--->RXmaster). И соответственно вместо КЗ у системы только коллизии при обмене. У этих интерфейсов всё продумано и для КЗ в том числе.
    И исходя из этого тысячи протоколов таких как Modbus RTU и т.п. Кстати автор хотел именно ASCII ну и Modbus ASCII ему в применение. Вот только на много устройств надо повторители сегментов сети. Дабы много приёмников (slave) и только один передатчик(master) для запроса и для ответа уже отвечающий перегружен.
    Повторители для RS485 самодельные будут сложными всё-таки в две стороны повторять. А вот RS422 просто - одна линия(пара) одно направление.
     
    Ariadna-on-Line нравится это.
  12. Igor68

    Igor68 Гуру

    И повторит пародию на PROFIBUS на RS232:D
     
  13. parovoZZ

    parovoZZ Гуру

    I2C как раз и выдуман для межпроцессорной связи. 485 для длинных линий, но никак не для печатных плат.
     
  14. Не будет КЗ, но один зависший в ноль выход - завесит всю линию.
     
  15. Igor68

    Igor68 Гуру

    Плат? Тут разговор про элементы на одной/нескольких плате/платах в одном корпусе устройства?
     
  16. Igor68

    Igor68 Гуру

    Тогда надо долбанутым быть, что бы таскать данные в текстовом виде между соседними элементами. Вот блин куда процессорное время тратится - на парсинг. Или последовательно скрипт обсасывается? по конвейеру?
     
  17. AlexU

    AlexU Гуру

    А при чём тут RS232? Речь идёт про USART. Это разные интерфейсы...
     
  18. Igor68

    Igor68 Гуру

    Думал разные приборы/устройства. Ну и не понял. А названия - так и в инструкциях на приборы бывает обзывают по всякому. Иди пойми. Вот и я не понял.
     
  19. SergeiL

    SergeiL Гуру

    ТС не уточнял ни расстояний между устройствами ни схему подключения.
    Но написал, что разные устройства, значит не на одной плате. :)
     
  20. Igor68

    Igor68 Гуру

    Да ну их к лешему. Они все думают, что кругом телепаты.
     
    ostrov и DetSimen нравится это.