Пожалуйста, объясните раздел voidloop() скетча.

#include <VirtualWire.h>

int PWMB = 5; //Контроль скорости

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

  //настройка приемника
  vw_set_rx_pin(2);  
  vw_set_ptt_inverted(true); 
  vw_setup(2000);
  vw_rx_start();
}

void loop(){
  uint8_t buf[VW_MAX_MESSAGE_LEN]; 
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  if (vw_get_message(buf, &buflen)) // Неблокируемый
  {
    int i;
    int column = 0;
    String message;
    int commands[30];

    for (i = 0; i < buflen; i++)
    { 
      //ОТЛАЖИВАТЬ:
      Serial.print(char(buf[i]));

      if(char(buf[i]) == '|'){
        commands[column] = message.toInt();
        message = "";
        column++;
      } else {
        message += char(buf[i]);
      }
    }

  commands[column] = message.toInt();
  }
}

Эта тема является ответной стороной моей последней темы: пожалуйста, объясните приложенный скетч эта дата отправки и это получатель.

вопросы:

  1. Массив дат передачи передатчика [60], например: 523 | 487, здесь int Commands[30]; всего 30, это нормально?
  2. if(char(buf[i]) == '|') / Commands[column] = message.toInt();, кажется, просто конвертирует дату перед '|'?
  3. Каков результат message += char(buf[i]);?

Спасибо

, 👍0


1 ответ


1

Массив дат передачи передатчика [60], например: 523 | 487, здесь " int Command[30];" всего 30, это нормально?

Если у вас есть максимум 59 символов (59 печатных символов плюс NULL в конце равно 60), и каждое число разделено символом |, тогда максимально возможные числа, которые вы можете иметь , если все они однозначные, равно 30. Так что да, массив из 30 целых чисел подойдет.

" if(char(buf[i]) == '|')/commands[column] = message.toInt();", кажется, просто конвертирует дату перед '|'?

Да. Он берет все, что было помещено в message, и преобразует его в целое число, а затем очищает message для следующего числа.

каков результат " message += char(buf[i]);"? Спасибо

Он добавляет текущий символ из буфера (на который указывает i) в конец строки message.

Это не лучший способ сделать это, и он может испортить вашу кучу, что приведет к сбою вашего Arduino через некоторое время.

Лично я бы использовал strtok() непосредственно в буфере:

int i = 0;
char *part = strtok(buffer, "|");
while (part) {
    command[i] = atoi(part);
    i++;
    part = strtok(NULL, "|");
}

Конечно, предполагается, что buffer правильно завершается NULL.

,

@ Маженко♦ Спасибо, Маженко♦, не могли бы вы обратиться к: https://arduinoprosto.ru/q/62576/please-explain-the-sketch-attached/62579?noredirect=1#comment134324_62579 и посмотреть, какая дата отправил? и посмотреть, есть ли совпадения?, @laoadam