arduino + Uart и пакетная передача

Тема в разделе "Arduino & Shields", создана пользователем Andrew_by, 19 янв 2016.

  1. Andrew_by

    Andrew_by Нуб

    привет всем..
    кто подскажет как написать код ?, что бы ардуинка сидела и слушала Uart на предмет прохождения пакета
    к примеру
    0x55 0x04 0xe4 0x04 0x03

    выдала бы вот ответ пакет
    0x55 0x04 0xe4 0x01
     
  2. DrProg

    DrProg Вечный нерд

  3. Andrew_by

    Andrew_by Нуб

    а то читать не умею)..

    да массив, но для меня это просто последовательность ..
     
  4. Andrew_by

    Andrew_by Нуб

    Код (C++):

    byte GetData[] = {0x02,0x12,0x00}
    byte DataOtvet[] = {0x02,0x06,0x06,0x06,0x06,0x06};

    void setup(){  
      Serial.begin(115200);
    }

    void loop(){
      if(Serial.available() > 5) {
        for(int i=0;i<6;i++){
          if(GetData[i]!=Serial.read()){
            Serial.write(DataOtvet[]);
          }
        }
      }  
    }
    что то типа такого?
     
  5. lerik2703

    lerik2703 Гик

    Код (C++):
     Serial.write(DataOtvet,sizeof(DataOtvet));
    наверно так правильней))
    почему не равно?
     
  6. Andrew_by

    Andrew_by Нуб

    Код (C++):

    byte GetData[] = {0x55,0x04,0xe4,0x04,0x03};
    byte DataOtvet[] = {0x55,0x04,0xe4,0x01};
    byte InData[5];

    void setup(){
      Serial.begin(115200);
    }

    void loop(){
      if(Serial.available() > 5) {

       Serial.readBytesUntil('0',InData,5);
       for(int i = 0;i<5;i++){
         if(GetData[i]=InData[i])Serial.write(DataOtvet,sizeof(DataOtvet));
       }

      }
    }

     
    поправь плз если где то накосячил)

    в итоге имеем ..еcли прилетает пакет 0x55,0x04,0xe4,0x04,0x03 то ардуинка тут же шлет в ответ 0x55,0x04,0xe4,0x01
     
  7. Andrew_by

    Andrew_by Нуб

    поправил)
     
  8. lerik2703

    lerik2703 Гик

    правильней все же будет без цикла
    if GetData[1]==InData[1] && GetData[2]==InData[2] ...и по аналогии
    если длинна фиксированная конечно
     
  9. lerik2703

    lerik2703 Гик

    так мы сравниваем каждый байт в отдельности и если правильные все тогда отвечаем а так мы будем отправлять пакет при каждом совпадении...
     
  10. Andrew_by

    Andrew_by Нуб

    такс... а как написать если мне нужна проверка пакета длинной 20 байт?)) что все 20= писать что ль?) .. может есть програмистский ход конем что красиво все было ?
     
  11. Andrew_by

    Andrew_by Нуб

    Код (C++):
    byte GetData[] = {0x55,0x04,0xe4,0x04,0x03};
    byte DataOtvet[] = {0x55,0x04,0xe4,0x01};
    byte InData[5];
    int state=0;

    void setup(){
      Serial.begin(115200);
    }

    void loop(){
      if(Serial.available() > 5) {

       Serial.readBytesUntil('0',InData,5);
       for(int i = 0;i<5;i++){
         if(GetData[i]=InData[i])
         {
          state=1;
         }else
         {
          break;
         }
         ;
         if (state=1)Serial.write(DataOtvet,sizeof(DataOtvet));
         state=0;
       }
      }
    }
     
  12. lerik2703

    lerik2703 Гик

    Код (C++):
    byte GetData[] = {0x55, 0x04, 0xe4, 0x04, 0x03};
    byte DataOtvet[] = {0x53, 0x65, 0x6e, 0x64, 0x31, 0x32};
    bool correct_byte;

    byte InData[sizeof(GetData)];

    void setup() {
      Serial.begin(115200);
    }

    void loop() {

      if (Serial.available()) {
     
         Serial.readBytes(InData, sizeof(GetData));
     
        for (int i = 0; i < sizeof(InData); i++) {

          if (GetData[i] == InData[i])

            correct_byte = true;
     
          else {
            correct_byte = false;
            break;
          }
        }

        if (correct_byte) {
          correct_byte = false;
          Serial.write(DataOtvet, sizeof(DataOtvet));

        }
      }
    }
     
    тогда уж так и то не лишено недостатков
     
    Tomasina нравится это.
  13. Andrew_by

    Andrew_by Нуб

    спасибо огромное за помощь.. но получив сей код.. понял еще дальше по своей задаче..
    в итоге имею:

    есть девять массивов байт при получении ардуинкой которых, она должна дать в ответ 1 из 9 других массиво данных..

    Код (C++):

    byte GetData1[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD3,0xDF};
    byte DataOtvet1[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAB,0x1A};
    byte GetData2[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x92};
    byte DataOtvet2[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x01,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x2F,0x00,0x00,0x00,0x00,0xAA,0x5B};
    byte GetData3[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x44};
    byte DataOtvet3[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x02,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xAC};
    byte GetData4[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD4,0x09};
    byte DataOtvet4[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x03,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x2F,0x00,0x00,0x00,0x00,0x17,0xED};

    byte GetData5[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0x8E};
    byte DataOtvet5[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAB,0x1A};


    byte GetData6[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x01,0x00,0x40,0x00,0x01,0xC3,0x41};
    byte DataOtvet6[] = {0x55,0x2B,0x04,0x58,0x0c,0x03,0x01,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0x9f,0x01,0x04 надо дописать crc};
    byte GetData7[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x02,0x00,0x40,0x00,0x01,0xC3,0x41};
    byte DataOtvet7[] = {0x55,0x2B,0x04,0x58,0x2c,0x03,0x02,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0x59,0x01,0x04  надо дописать crc};
    byte GetData8[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x03,0x00,0x40,0x00,0x01,0xC3,0x41};
    byte DataOtvet8[] = {0x55,0x2B,0x04,0x58,0x4c,0x03,0x03,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0xE2,0x01,0x04  надо дописать crc};
    byte GetData9[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x04,0x00,0x40,0x00,0x01,0xC3,0x41};
    byte DataOtvet9[] = {0x55,0x2B,0x04,0x58,0x6c,0x03,0x04,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0x38,0x01,0x04  надо дописать crc};






    byte InData[5];
    int state=0;

    void setup(){
      Serial.begin(115200);
    }

    void loop(){
      if(Serial.available() > 50) {

      }
    }
    как бы правильнее это написать? .. не писать же case везде ?
    на каждый GetData .. может быть только один ответ DataOtvet
     
  14. Andrew_by

    Andrew_by Нуб

    мм.. это то понятно .. как бы правильно это сделать?)) покажи плз пример хоть на одном пакете)
     
  15. Andrew_by

    Andrew_by Нуб

    Код (C++):

    byte GetData10[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD3,0xDF};
    byte GetData11[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x8e};
    byte DataOtvet1[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAB,0x1A};
    byte GetData20[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x92};
    byte GetData21[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xc3};
    byte DataOtvet2[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x01,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x2F,0x00,0x00,0x00,0x00,0xAA,0x5B};
    byte GetData30[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x44};
    byte GetData31[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x15};
    byte DataOtvet3[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x02,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xAC};
    byte GetData40[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD4,0x09};
    byte GetData41[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x58};
    byte DataOtvet4[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x03,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x2F,0x00,0x00,0x00,0x00,0x17,0xED};

    byte GetData50[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0x8E};
    byte DataOtvet50[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAB,0x1A};


    byte GetData60[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x01,0x00,0x40,0x00,0x01,0xC3,0x41};
    byte DataOtvet60[] = {0x55,0x2B,0x04,0x58,0x0c,0x03,0x01,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0x9f,0x01,0x04,0x4d,0x8c};
    byte GetData70[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x02,0x00,0x40,0x00,0x01,0x6f,0xd9};
    byte DataOtvet70[] = {0x55,0x2B,0x04,0x58,0x2c,0x03,0x02,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0x59,0x01,0x04,0xae,0x53};
    byte GetData80[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x03,0x00,0x40,0x00,0x01,0x9a,0x55};
    byte DataOtvet80[] = {0x55,0x2B,0x04,0x58,0x4c,0x03,0x03,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0xE2,0x01,0x04,0x57,0x0a};
    byte GetData90[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x04,0x00,0x40,0x00,0x01,0x26,0xe0};
    byte DataOtvet90[] = {0x55,0x2B,0x04,0x58,0x6c,0x03,0x04,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0x38,0x01,0x04,0x05,0x38};






    byte InData[5];
    int state=0;

    void setup(){
      Serial.begin(115200);
    }

    void fnDataOtvet1()
    {
    for (int i=0;i<28;i++){
      Serial.write(DataOtvet1[i],28);
    }
    }
     
     
    Последнее редактирование: 20 янв 2016
  16. Andrew_by

    Andrew_by Нуб

    неээ там всего 13 пакетов которые нужно проверять и 9 пакетов ответов.. это просто переменная так
     
  17. Andrew_by

    Andrew_by Нуб

    длина пакета (массива) к примеру GetData90[], или любого другого пакета содержится в втором байте

    по сути.. мне кажется надо так
    1. получаем данные с UART
    2. как только встречаем пакет 0x55 , делаем начало сбора пакета
    3. получаем второй пакет, переводим в десятичную, на выходе получаем длину пакета также добавляем егов массив
    4. на основании длины пакета, получаем с UART остальные пакеты, пока i не станет равно длине пакета
    5. как только пакеты все получены и массив сформирован
    6. сверяем его с одним из 13 пакетов и при нахождении соответсвия выдает определенный пакет в ответ.

    я правильно описал логику работы?
    или надо не ждать конца пакета а побайтно сравнивать со всеми 13 массивами и если при окончании вхождение найдено . тут же выдать ответ.

    или как ?)
     
  18. Andrew_by

    Andrew_by Нуб

    че то нигде нет описания толкового на ReadByteUntil, каким макаром она дожидается окончания пакета?..


    вобщем совсем зарылся..

    логика понятна а синтаксис хромает
     
  19. Andrew_by

    Andrew_by Нуб

    ну просто когда не оч понимаю) могу наделать ошибок ..

    Код (C++):

    bool compareArrays(byte Array_1[],byte Array_2[],bool Size){
                   
      int minSize;

      if(sizeof(Array_1)!=sizeof(Array_2)&&!Size)return(false);
      if(sizeof(Array_1)>sizeof(Array_2))minSize = sizeof(Array_2);
      else minSize = sizeof(Array_1);

      for(int i = 0; i < sizeof(minSize); i++)  if(Array_1[i]!=Array_2[i])return(false);
      return(true);
    }



    void setup(){
      Serial.begin(115200);

    }



    void loop()
    {

    1. сначала ловим байт 0х55.. что бы не нарваться на остатки прошлого пакета
    2. как только находим байт, ставим флаг что начало пакета найдена
    3. слушаем второй байт , он определяет длинну будущего пакета, формируем переменную lengthTemp
    4. начинаем дальше слушать и записываьб байты в массив пока не i!=(lengthTemp-2)   -2 потому что первые два байта ушли на пакет и байт длины
    5. ставим флаг endPacketFlag=1 что сборка пакета завершена
    6. если флаг endPacketFlag=1, то запускаем цикл сравнения двух массивов
    7. при нахождении соответствия, запускаем функцию выдачи в порт массива значений.
    8. дальше опять ловим байт 0х55
    }
     
    алгоритм то хоть правильный ?

    какие команды или куски кода использовать? ..оч нужно а сам не могу (
     
  20. Andrew_by

    Andrew_by Нуб

    ооо нашел ответ . мож кому пригодиться

    Код (C++):
    struct CMsg
    {
      const byte * const In;
      const byte * const Out;
      const int SizeIn;
      const int SizeOut;
      CMsg ( byte * in, int size_in, const byte * out, int size_out )
      :  In ( in )
      ,  SizeIn ( size_in )
      ,  Out ( out  )
      ,  SizeOut ( size_out )
      {}
    };

    CMsg Messages [] = {
      CMsg ( GetData10, sizeof (GetData10), DataOtvet1, sizeof (DataOtvet1) ),
      CMsg ( GetData11, sizeof (GetData11), DataOtvet1, sizeof (DataOtvet1) ),
      CMsg ( GetData20, sizeof (GetData20), DataOtvet2, sizeof (DataOtvet2) ),
      CMsg ( GetData21, sizeof (GetData21), DataOtvet2, sizeof (DataOtvet2) ),
      CMsg ( GetData30, sizeof (GetData30), DataOtvet3, sizeof (DataOtvet3) ),
      CMsg ( GetData31, sizeof (GetData31), DataOtvet3, sizeof (DataOtvet3) ),
      CMsg ( GetData40, sizeof (GetData40), DataOtvet4, sizeof (DataOtvet4) ),
      CMsg ( GetData41, sizeof (GetData41), DataOtvet4, sizeof (DataOtvet4) ),
      CMsg ( GetData50, sizeof (GetData50), DataOtvet5, sizeof (DataOtvet5) ),
      CMsg ( GetData60, sizeof (GetData60), DataOtvet6, sizeof (DataOtvet6) ),
      CMsg ( GetData70, sizeof (GetData70), DataOtvet7, sizeof (DataOtvet7) ),
      CMsg ( GetData80, sizeof (GetData80), DataOtvet8, sizeof (DataOtvet8) ),
      CMsg ( GetData90, sizeof (GetData90), DataOtvet9, sizeof (DataOtvet9) )
    };

    /*
    * Test std::vector
    */


    void setup() {
      Serial.begin(115200);
    }

    void loop() {
      // put your main code here, to run repeatedly:
      byte cur;
      do
      {
        cur = Serial.read();
      }
      while ( cur != 0x55);

      byte msg_len = Serial.read ();

      byte Buffer [ 256 ];
      for ( int i = 0; i != msg_len; ++i )
      {
        Buffer [ i ] = Serial.read ();
      }

      for ( int i = 0; i != sizeof ( Messages ) / sizeof ( CMsg); ++i )
      {
        if ( Messages [ i ].SizeIn != msg_len  )
          continue;
       
        bool Valid = true;
        for ( int j = 0; j != msg_len; ++j )
        {
          if ( Messages [ i ].In [ j ] != Buffer [ j ] )
          {
            Valid = false;
            break;
          }
        }

        if ( Valid )
        {
          for ( int j = 0; j != Messages [ i ].SizeOut; ++j )
            Serial.write ( Messages [ i ].Out [ j ] );

          return; // reply sent
        }
      }
    }