Не могу понять этот процесс кода
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
@Macaroni, 👍0
Обсуждение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. Затем он нарезает оставшуюся часть строки, каждый раз ища следующий пробел, и преобразует каждую часть в целое число, которое сохраняется в массиве.
Затем он отправляет этот массив.
Я был тупым, оказалось, что он преобразовывал шестнадцатеричное число в целое. Я отправил массив через последовательный порт и посмотрел его.
- avrdude ser_open() can't set com-state
- Float печатается только 2 десятичных знака после запятой
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Печать массива байтов на экране последовательного монитора Arduino IDE
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
- Arduino IDE Отказано В Разрешении На Загрузку, Ubuntu
- Нет заголовочных файлов (.h) в Documents\Arduino\libraries\arduino_144469 с демонстрационным кодом
- Связь Arduino master/slave с использованием RS485
Извините, я не хочу скачивать какой-то случайный файл со случайного сайта. Пожалуйста, включите весь соответствующий код в свой вопрос. Где ты взял этот код? Я натыкаюсь на цикл while. В настоящее время я не понимаю, как это будет работать, поскольку `p = strchr(p, ' ') установит указатель p на следующее вхождение символа пробела. Затем код пытается преобразовать этот символ пробела в виде шестнадцатеричной строки в целое число. Вы уверены, что этот код действительно работает?, @chrisl
Да, я уверен, что это работает :), @Macaroni