Проблемы с кнопками. Страанные и нелогичные.(закрыто)

Тема в разделе "Arduino & Shields", создана пользователем Поручик, 3 сен 2016.

  1. Поручик

    Поручик Нерд

    Код (C++):
    char key1[30];//сюда выписываем код из буфера

    дальше идёт не относящаяся к делу часть кода

      if(HandContr==false){//если не ручное управление
    uint8_t buf1[VW_MAX_MESSAGE_LEN];
    uint8_t buflen=VW_MAX_MESSAGE_LEN;
    int i=1;
    if (vw_get_message(buf1, &buflen)){//если что-то пришло
    if (buf1[0] != FIRST_BYTE || buf1[buflen-1] != LAST_BYTE){ // но оно не соответствует байтам первый и последний то дропаем
        return;
    }
    while (buf1[i] != LAST_BYTE) {//если байты правильные, то перекачиваем буфер в код
      key1[i-1]= buf1[i];//  КОСЯК СУДЯ ПО ВСЕМУ ГДЕ-ТО ТУТ, ТАК КАК, ЕСЛИ key1 ПРОГНАН МАКСИМАЛЬНО ДЛИННЫМ КОДОМ, ТО ВСЁ РАБОТАЕТ ОК. ЕСЛИ СНАЧАЛА ПРОГНАТЬ КОРОТКИЙ КОД, ТО В КЕЙ ПИШЕТСЯ КАКАЯ-ТО ЕРУНДА
    i++;
    }
    key1[i-1]=0;
    Serial.println(key1);
    modeChois(key1);//отправляем в обработку
    }    
    }

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

    дополнил кусочком, где объявляю key1

    конкретнее, полученное сообщение, упорно не желает читаться полностью, если первое что принял приёмник не самый длинный код. обрезает он последние 1-2 символа кода. а вот почему я не могу разобраться никак. совсем никак.
     
  2. qwone

    qwone Гик

    Все продолжаете бороться с Меню?
     
  3. Поручик

    Поручик Нерд

    не. меню работает как надо, на удивление. тут уже дальше процесс. склоняюсь прикрутить хитрый костыль под это дело.
     
  4. fogary

    fogary Гик

    Вы можете показать содержимое отправленного сообщения, buf1 после получения, key1 до и после копирования из buf1. Для удачного и неудачного случая, с Вашей точки зрения.

    Вы копируете из буфера в key1 что бы отбросить первый байт, или для другой цели?
     
  5. Поручик

    Поручик Нерд

    в буфер суется автоматом пришедшее сообщение, которое уже пихается в чаровый кей для дальнейшего попила. примеры кодов:
    принципиально правильные:
    3a0; 3a1; 2a34a23a; 1a15
    и т.д.

    что приходит, если нет инициализации:
    3a%; 3а; 1; 1a; 1°; etc

    но если первый пришедший код максимально длинный, то всё хорошо работает.
     
  6. fogary

    fogary Гик

    Вы можете вывести и показать содержимое buf1 после получения сообщения:
    Код (C++):
    if (vw_get_message(buf1, &buflen)){
      Serial.print("buf1 =");
      for (int a = 0; a < buflen; a++){
        Serial.print(" ");
        Serial.print(buf1[a]);
      }
      Serial.println("");
      if (buf1[0] != FIRST_BYTE || buf1[buflen-1] != LAST_BYTE){
      . . .
    Из Вашего объяснения выходит, что сообщения могут иметь разную длину, но размер буфера у Вас фиксированный и проверка старт/стоп байтов реализована для 0 и buflen-1. Нет ли здесь противоречий?

    Если перед копированием в key1 инициализировать его нулями, как-нибудь влияет на результат?
     
  7. Поручик

    Поручик Нерд

    да. Буфер определяется библиотечной константой по длине пришедшего сообщения.
    чуть позже доползу до выдергивания буфера в порт.

    Да, пробовал инициализировать массив key1, не помогает. та же проблема.