arduino - оптправка и расшировка потока данных в уарт

Тема в разделе "Arduino & Shields", создана пользователем ДмитрийД, 2 апр 2016.

  1. ДмитрийД

    ДмитрийД Нерд

    Есть 2 арду соединенные через UART.

    Передатчик отдает команды в лупе вида:
    Код (Text):
    st="";
    st1="";
    String st="enc1,"+encoder1+",t";
    String st1="enc2,"+encoder2+",s";
    Serial.println(st);
    Serial.println(st1);
     
    Где encoder1,2 - показания оборотов с магнитного энкодера

    Приемник принимает строку и разбирает ее:
    Код (Text):
     
    int i:=0;
      char buffer[100];
    if (mySerial.available()) {
    while( mySerial.available() && i< 5) {
            buffer[i++] = mySerial.read();
         }
         //закрываем массив
         buffer[i++]='\0';
    }

      if(i>0){
       
        //разбираем его на части отделенные запятой
    sscanf(buffer, "%[^','],%[^','],%s", &unitID_in, &command_in, &data_in);
    Serial.println(unitID_in);
    Serial.println(command_in);
    Serial.println(data_in);
    Serial.print("\n");
    unitID_in [0] = '\0';
    command_in [0] = '\0';
      }

     
    Но в итоге получается каша, все сьезжает, как правильно в относительном реалтайме передавать показания энкодера с одной арду на другую?
     
  2. ostrov

    ostrov Гуру

    В код не вникал, но вижу, что буфер приема не кольцевой. Один байт пропустил и все поехало. Вот тут хороший пример приема-передачи пакетов данных между Ардуинами. Я на этом примере сделал первую сеть устройств через RS485, только добавил в пакет контрольный байт, все замечательно работает.
     
  3. Megakoteyka

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

    Если вы передаете всего пару байт, то зачем городить обмен на строках? Прилепите к двум байтам третий с контрольной суммой и задача упростится на порядок.
     
  4. ДмитрийД

    ДмитрийД Нерд

    Можете чуть подробнее рассказать, пока не совсем понял смысл?
    могу упростить команду например до вида : e123s , где e- название датчика, 123- меняющиеся обороты, s-окончание.
    Как именно правильно передать эту команду? как правильно работать с контрольной суммой? как это выглядит? пока в этом опыта нет
     
  5. ostrov

    ostrov Гуру

    Вот тут очень хороший пример пакетной передачи данных между Ардуинами. Правда без контрольной суммы, но добавить один байт в пакет не проблема. Пакет можно вообще любой длины и состава сделать, в зависимости от задачи.
     
  6. Megakoteyka

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

    Например:
    - первый байт - признак начала пакета
    - второй байт - номер датчика
    - третий байт - значение
    - четвертый байт - сумма второго и третьего с отбрасыванием переполнения.
    На приеме нужно всегда иметь 4 последних байта. Если первый равен признаку начала, а последний равен сумме второго и третьего, то пакет считается достоверно принятым и обрабатывается, а байты начинают копиться заново. Если контрольная сумма не сходится, то пакет не обрабатывается, а начинается ожидание стартового байта и накопление пакета.
     
  7. ostrov

    ostrov Гуру

    Я двухуровневую систему на свой страх и риск делаю. Схема такая: один главный пинает по очереди ведомые первого уровня (по списку активных, реально 2-3 из 10). Ведомый приняв команду пинает ведомый второго уровня, их 0-2 штуки на каждый ведомый первого уровня. Тот отвечает первому, тот главному и так по кругу. Причем главный ждет пока все они заткнутся прежде чем отправить следующий запрос. Коллизий пока удается избегать. Пакет такой:

    Стартовый байт,
    адрес пинаемого,
    команда пинаемому (или ответ от пинаемого),
    кс из 2 и 3 пунктов,
    стоповый бит.

    Хотел добавить адрес отправителя, но решил что это излишне. За счет многоуровневости ответ о сработке на главный чаще всего приходит не сразу, а на следующий пинок, то есть через 50-200 мс, если это не смертельно, то вполне рабочая система получается. Пока что на шине висит главный, три первых, два вторых плюс общий для всех (рулит освещением, команды принимает от всех), на очереди еще гирлянда. Надеюсь, что все будет работать стабильно после увеличения "жильцов" до номинала.

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

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

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

    ostrov Гуру

    Некоторые слейвы состоят как бы из двух половин. То есть он вроде бы один, но разные датчики находится в разных комнатах. Сигнал же должен приниматься и передаваться как единому целому. Но все они висят на одной шине, то есть схематически все выглядит как одна гирлянда, а тактически как елочка. )
     
    Последнее редактирование: 5 апр 2016
  10. Unixon

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

    RS422 и не нужно никого ждать.
     
  11. ostrov

    ostrov Гуру

    Можно парой слов подробнее? Преимуществ в описании я не нашел.

    Интерфейс RS-422 используется гораздо реже, чем RS-485 и, как правило, не для создания сети, а для соединения двух устройств на большом расстоянии (до 1200 м). Каждый передатчик RS-422 может быть нагружен на 10 приемников. Интерфейс работоспособен при напряжении общего вида до ±7 В.
     
  12. Unixon

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

    Считайте, что это RS485 + full duplex. Для RX/TX отдельные дифф. пары, в остальном то же самое.
     
  13. ostrov

    ostrov Гуру

    Дуплекс не совсем мой вариант. Для двух устройств, наверное хорошо, но у меня их будет в районе 20, как начнут галдеть и разберись кто кому. Все равно придется устанавливать очередность и ждать пока одно выговорится прежде чем дать слово другому. К тому же скорость передачи данных не критична, да и пакеты смешные.
     
  14. Unixon

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

    На каждый узел завести несколько аппаратных UART-ов и навесить функции роутера, а дальше все почти как в Ethernet, только RS422 в качестве транспорта и протоколы попроще.
     
  15. ostrov

    ostrov Гуру

    Спасибо конечно, но пожалуй не стоит так усложнять ради упрощения. ))