Передача нескольких значений по serial.

Тема в разделе "Arduino & Shields", создана пользователем greiverff, 11 сен 2012.

  1. greiverff

    greiverff Нерд

    Попробую сравнить, спасибо.
     
  2. hibiki

    hibiki Гик

    i2c, конечно, рулит - можно будет, например, не два модуля, а больше на один канал передачи посадить
     
  3. КвазИ

    КвазИ Нерд

    привет всем
    имею 4 числа float но естественно можно и int допустим (x1=12.54 x2 = 13.48 x3 = 125.7 x4 = 152.8)

    нужно передать их с одной ардуины на другую через софтваресериал (модули HC-12) (расстояние 500м прямая видимость)

    данные передаються раз в минуту не чаще..

    как лучше передавать данные? отдельно каждое число или как-то можно всё это засунуть в один пакет и передать и как-то потом его распаковать? мне почему-то кажеться так будет надежней

    пока что сделал разбивку каждого числа на 2 байта (перевёл числа в int) а потом их собираю.. но не всегда корректно выходит(
    наверное нужно 4 числа собрать в массив а потом через serial.write этот массив отправить..

    вот и не понимаю как это сделать.. туплю..(

    и как лучше передавать масивом байт или строкой?
     
    Последнее редактирование: 24 мар 2017
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    мое мнение - передавать каждое число отдельно.
    Плюсы: посылка короче, ее сложнее повредить; при сбое связи теряешь только это число, а не все 4.
     
  5. КвазИ

    КвазИ Нерд

    это вроде бы и верно но я отправляю 4 числа последовательно и при получении если вдруг была помеха то потеряю одно число и при сборе (на стороне приёмника) соберётся не правильная последовательность.. что не есть хорошо...
    ну т.е. я имею ввиду допустим потерялось число х2
    x1 = x1
    x2 = x3
    x3 = x4
    x4 = .. не получит ничего...
    вот поэтому и думаю чтобы отправлять одним пакетом..
    я отпраляю 4хзначные числа например (1425) по 2 байта
    отправка
    Код (C++):

    int valt =1425;
    byte b2 = (byte)(valt>>8);
    byte b3 = (byte)valt;
    radio.write(b2);
    delay(100);
    radio.write(b3);
    прием
    Код (C++):
    while (radio.available() > 0)
    {
    rx_datac=radio.read();

    if (f1==0 && rx_datac<20)
    {
    b4= rx_datac;
      b2=b4;
    f1=1;
    }

    if (f1==1 && rx_datac>10)
    {
      b5= rx_datac;
      b3=b5;
      f1=2;
    }
    if (f1==2)
    {
      vall = ((unsigned int )b2 <<8) | b3;
      f1=0;

    rx_data = vall;

    }
    т.е. по сути мне нужно передать 16байт а за один пакет модули могут передавать 32байт т.е. мне подходит... я так понимаю что числа в одном пакете не смогут "исказиться" т.е. он либо приметься либо нет.. или может я не правильно понимаю..
     
    Последнее редактирование: 24 мар 2017
  6. issaom

    issaom Гуру

    Я бы организовал отправку пакета с подтверждением получения - отправляю первый байт и отсылаю его обратно. Как только пришёл ответ сравниваю его и если все хорошо отправляю следующий и.т.д. Если приёмник вернул черт те шо делаю задержку на передатчике - приёмник понимает что произошла какая-то попа и ждет что ему начнут отправлять пакет заново. После этого передатчик через чуть больший временной интервал начинает передавать последовательность байт с первого байта. И на приемнике и передатчике можно будет со 100й вероятностью быть уверенным что все байты пришли
     
  7. sanik

    sanik Гик

    А не подскажите как эти 6 значений запаковать в массив? Компилятору это не нравиться
    Код (C++):
    void loop() {
      values1 = map(axis_X, 0, 1024, 0, 255);
      values2 = map(axis_Y, 0, 1024, 0, 255);
      values3 = map(axis_Z, 0, 1024, 0, 255);
      x[0] = values1;
      x[1] = values2;
      x[2] = values3;
      softSerial.write(x[i], 6); \\где x[i] массив 6 длинна его
     
    Последнее редактирование: 14 июл 2017
  8. Arkad_snz

    Arkad_snz Гик

    А JSON уже не в моде?
     
  9. Arkad_snz

    Arkad_snz Гик

    Формируйте JSON-строку - у вас она уже почти готова, и строку просовывайте через HC-12, На приемнике - раскодируете строку в структуру...
     
  10. vvr

    vvr Инженерище

    я бы ещё каждой передаче присваивал номер, 1,2,3,4.
    дошли до 4 - опять ждём 1.
     
  11. Igor68

    Igor68 Гуру

    Не забудьте прикрутить контрольную сумму... ну как в Modbus RTU;)
     
  12. Igor68

    Igor68 Гуру

    И вообще... самое простое Modbus RTU. Ведущий спрашивает, а ведомый отвечает. Ведомых может быть много. И никакой путаницы... и данные с контрольной суммой. Соответственно достоверность подтверждена.
     
  13. Igor68

    Igor68 Гуру

    Ну и номер параметра (регистр или более) спрашивает ведущий у ведомого(имеющего свой адрес в сети).
     
  14. Arkad_snz

    Arkad_snz Гик

    Хоть бы раз кто-нить, где-нибудь выписал/нарисовал порядок передачи данных (не одного байта-команды!) XBee -> HC-12!
    В Тырнете море отдельных фрагментов - как проводок к пину подключить..., и прочие мелкие подробности, а полностью - схемы приемника и передатчика с прогами - нет.
    Берешь XBee - в Вики у Амперки все расписано - как подключать, как передавать...
    С HC-12 - тоже все есть.
    А, пара приемник-передатчик нигде целиком не описана.
    -----
    Можно задать здесь в форуме конкретный вопрос/пример: Есть робот на Стреле - управляется с ПДУ на Искре по ИК-каналу. Для управления роботом необходима некоторая телеметрия физ-параметров робота и обстановки на ПДУ.
    Как посадить XBee на Стрелу - описано, как подключать HC-12 к Искре - тоже, но всей конструкции/процесса - не вижу (в проекте).
    Уверен, что здесь обсуждение упрется в копание в мелочах или в заумных дебрях...
    Похоже, что придется заказывать железо, и садиться за сборку с подробным описанием. Наверняка я не единственный с подобной проблемой. Придется стать первым...
     
    Последнее редактирование: 14 июл 2017
  15. Igor68

    Igor68 Гуру

    Ничего не могу сказать, но по:
    http://digitrode.ru/computing-devices/mcu_cpu/765-priemoperedatchik-hc-12-i-arduino.html
    не заметил ограничений по передачи байтов (то ест не надо "экранировать" ряд из них). То есть протокол можно применять... а JSON оставьте для WEB страниц где есть Java Script... ну или подобное (покойники ё-моё). А вообще бамбук курить никому не возброняется!!!!!
     
  16. sanik

    sanik Гик

    Подскажите пожалуйста что я делаю не так компилятор выдает ошибку stray '\' in program Очень нужно передать значения по блютус Перерыл кучу примеров и нигде нет толкового как правильно передать массив по сериал
    Код (C++):
    int JOYSTICK_X = A3;
    int JOYSTICK_Y = A2;
    int JOYSTICK_Z = A6;
    #include <SoftwareSerial.h>     // Подключаем библиотеку SoftwareSerial для общения с модулем по программной шине UART
    SoftwareSerial softSerial(2, 3); // Создаём объект softSerial указывая выводы RX, TX (можно указывать любые выводы Arduino UNO)

    char x[3];
    int values1;  //переменная для передачи оси X
    int values2;  //переменная для передачи  оси Y
    int values3; //переменная для передачи  оси Z

    void setup()
    {

      softSerial.begin(38400);
      Serial.begin(9600); // Default communication rate of the Bluetooth module
    }

    void loop()
    {
      axis_X = analogRead(JOYSTICK_X);    // считываем аналоговое значение оси Х
      axis_Y = analogRead(JOYSTICK_Y);    // считываем аналоговое значение оси Y
      axis_Z = analogRead(JOYSTICK_Z);   // считываем цифровое значение оси Z
      values1 = map(axis_X, 0, 1024, 0, 255);
      values2 = map(axis_Y, 0, 1024, 0, 255);
      values3 = map(axis_Z, 0, 1024, 0, 255);
      x[0] = values1;
      x[1] = values2;
      x[2] = values3;
      for (int i = 1; i <= 3; i++)
      {
        softSerial..write(x[i]); \\выводим по порядку 6 значений
      }
    }
     
  17. Igor68

    Igor68 Гуру

    Это прикол? "\\" вместо "//" в комментарии это что? издевательство над людьми? Это свинство!!!:mad:
     
  18. Arkad_snz

    Arkad_snz Гик

    Перерыл все про JSON - не заметил ограничений "только для WEB страниц".
     
  19. Igor68

    Igor68 Гуру

    Значит потом заметитеееее! Очень заметите! Удачи!
     
  20. Igor68

    Igor68 Гуру

    У Вас не TCP соединение... так я понимаю!