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

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

  1. regent.correon

    regent.correon Нерд

    Доброго времени суток! Прошу сильно не пинать - только разбираюсь в вопросах связи по Serial. Задача не сильно сложна, но то, что должно работать по задумке на практике - глючит. В общем имеем 1 устройство Master и 5-7 устройств Slave. Master через некоторые промежутки времени должно посылать команды одному, другому, треьему. Устройства должны высылать ответ в виде ASCII строки. При разборе примера при посылке одного байта между девайсами все получается, а при посылке строки получается каша и ничего не распознается, т.к. Slave еще и обрабатывают датчики, а это занимает время. Поиск выдает какие-то сложные протоколы для компьютеров, загружать контроллер которыми не есть хорошо. Как это делается правильно?
     
  2. Vovka

    Vovka Гик

    Под каждую задачу делается конкретный алгоритм обработки.
    Я бы в этой ситуации поступил бы так: сделал бы две команды - одна запуск считывания/обработки датчика, а вторая на запрос результата. Тогда хоть сутки пусть обрабатывает - задержек не будет.
    Кстати, и не забудьте про байт номера Slave-устройства - чтоб можно было различать для кого запрос/ответ.
    И обязательно контрольная сумма передаваемых данных!
     
  3. Сериал поддерживает только связь точка-точка. Два устройства и всё.
     
  4. это тебе RS485 надо.



    общаться можно например библиотекой easytransfer
     
  5. parovoZZ

    parovoZZ Гуру

    а без библиотеки никак?
     
  6. да общайся как хочешь, хоть телеграфным ключом на 300бод.
     
  7. ostrov

    ostrov Гуру

    Подсказка же: погуглите по слову rs485.
     
  8. regent.correon

    regent.correon Нерд

    А о master /slave слышали? А о распределении по времени слышали? Да хоть тысячу slave можно навесить, дело в программной реализации и во времени вопроса и ответа будет! Что-то вы в данном случае не блеснули знанием, дядя Витя :) Если не можете ответить грамотно - лучше промолчать и не сбивать с толку.
     
  9. regent.correon

    regent.correon Нерд

    А при Ascii формате контрольная сумма тоже используется? И как, что-то я такие примеры не встречал.
     
  10. DetSimen

    DetSimen Guest

    Не надо столь резких и резвых суждений. Аппаратно сериал действительно поддерживает только точка/точка. При соединении нескольких устройств они ВСЕ будут принимать посылку как ОДНО устройство, невозможно приемнику запретить принимать данные с линии.
     
  11. DetSimen

    DetSimen Guest

    программно, да, можно в посылке указать адрес устройства, кому она предназначена.
     
    regent.correon нравится это.
  12. да, как порт выжжеш, так и внизапно появятся ограничение в аппаратной реализации ))
    а в протеусе да, хоть миллион вешай.
     
  13. regent.correon

    regent.correon Нерд

    Так о том и речь. Так работали первые сетевые карты для компов. (что на коаксиале связывались)
     
  14. regent.correon

    regent.correon Нерд

    Ну так про стеклянный и правила обращения с ним все слышали...
     
  15. видно специалист по обращению со стеклянным.
     
    parovoZZ нравится это.
  16. DetSimen

    DetSimen Guest

    ты не поверишь, наерна, но они и сейчас так работают.
     
    parovoZZ нравится это.
  17. b707

    b707 Гуру

    в данном случае чушь несете вы, а не дядяВитя. Особенно эпично смотрится этот наезд на фоне фразы из первого сообщения - "еще только разбираюсь с Сериал" :)
    Когда разберетесь - вот тогда и возвращайтесь, обсудим, есть ли в нем master /slave :)

    Чтобы "сокрушать авторитеты" - надо иметь соответсвующий уровень. А то может выйти как в вашем случае - смешно и глупо.
     
  18. Это замечательно, что вы слышали где-то кучу разных умных слов, но к сериалу это отношения не имеет.
     
  19. b707

    b707 Гуру

    да принмать это то еще пол-беды. Главное - никак невозможно запретить нескольким устройствам посылать данные в линию одновременно. Поэтому данные с slave непременно будут перемешаны, что ТС уже и наблюдает в своем "проекте".
    Конечно, можно нагородить "костылей" в попытке обойти проблему, но нафига изобретать велосипед, когда существует масса готовых решений?
     
  20. SergeiL

    SergeiL Оракул Модератор

    А как автор подключил к одному мастеру несколько слейвов? Схема или описание есть?

    Проблема даже не том, что передавать будут одновременно, это программно можно ограничить (в том же RS-485 это все равно придется делать программно).

    А проблема больше даже в том, что в стостоянии отсутствия передачи на выходе TX всех слейвов выставлены "1".
    В момент передачи, "1" меняются на "0" на одном из передатчиков. На остальных висят "1".
    То есть, параллельно их подключать нельзя, нужно развязывать, чтобы они не мешали и не попалили друг друга.

    Варианты тут конечно есть, но нужно это сделать правильно.
    Если сделать правильно, то на небольших расстояниях работать будет нормально, но правильней использовать RS-485.