Не могу понять этот процесс кода

    void loop()
    {
    if ( Serial.available() > 0 )
      {
    static char input[inputLength];

    static uint16_t i;

    char c = Serial.read();

    if ( c != '\n')
      input[i++] = c;

    else
    {
      input[i] = '\0';
      i = 0;

      uint16_t array[80];
      uint16_t j = 0;

      if ( !strncmp(input, "SEND", 4) )
      {
        char* p = input + 4;

        while ( (p = strchr(p, ' ')) != NULL )
          array[j++] = strtol(p, &p, 16);

        ir_start(array);
        Serial.println("WURKS");
      }
    }
  }
}

Здравствуйте, я не могу понять, что делает этот код. Я знаю главную цель, но я не могу понять процесс. Если кто-то может сделать код тупее для меня, я был бы признателен :). Полный код здесь, так как его сложно скопировать: https://anonfiles.com/z6ldWff0pf/no_lib_ino

, 👍0

Обсуждение

Извините, я не хочу скачивать какой-то случайный файл со случайного сайта. Пожалуйста, включите весь соответствующий код в свой вопрос. Где ты взял этот код? Я натыкаюсь на цикл while. В настоящее время я не понимаю, как это будет работать, поскольку `p = strchr(p, ' ') установит указатель p на следующее вхождение символа пробела. Затем код пытается преобразовать этот символ пробела в виде шестнадцатеричной строки в целое число. Вы уверены, что этот код действительно работает?, @chrisl

Да, я уверен, что это работает :), @Macaroni


2 ответа


2

За ним легче следить, если сделать правильный отступ. Я сделаю это и добавлю комментарии по ходу дела:

void loop() {
    if ( Serial.available() > 0 ) { // Если в буфере последовательного RX что-то есть

        static char input[inputLength]; // Создаем рабочую строку для хранения данных
        static uint16_t i; // Это текущий индекс в этой рабочей строке

        char c = Serial.read(); // Чтение следующего символа из серийного номера

        if ( c != '\n') // Если это не символ "перевод строки"...
            input[i++] = c; // затем сохраняем его во входной строке и увеличиваем i

        else { // Иначе...
     
            input[i] = '\0'; // Завершить строку с помощью NULL, чтобы сделать ее действительной C
            i = 0; // Сбросьте индекс на 0, готовый к следующему разу

            uint16_t array[80]; // Создаем массив из 80 целых чисел (временный)
            uint16_t j = 0; // И индексная переменная

            if ( !strncmp(input, "SEND", 4) ) { // Если строка начинается с SEND
                char* p = input + 4; // создаем "указатель" к строке, которая начинается с 4 символов в

                while ( (p = strchr(p, ' ')) != NULL ) // Пока где-то в строке есть пробел
                    array[j++] = strtol(p, &p, 16); // преобразуем первую часть в число, сохраняем ее в массиве и перемещаем указатель на следующий пробел.

                ir_start(array); // Отправляем массив через ИК
                Serial.println("WURKS"); // Сообщите нам, что это сработало
            }
        }
    } 
}

Итак, вы видите, что он получает данные через последовательный порт и сохраняет их, байт за байтом, в input, пока не получит \n, после чего он проверяет, не запускается ли он. с помощью SEND, а затем эффективно "отключает" SEND, рассматривая только все после SEND. Затем он нарезает оставшуюся часть строки, каждый раз ища следующий пробел, и преобразует каждую часть в целое число, которое сохраняется в массиве.

Затем он отправляет этот массив.

,

0

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

,