Пожалуйста, объясните раздел 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();
}
}
Эта тема является ответной стороной моей последней темы: пожалуйста, объясните приложенный скетч эта дата отправки и это получатель.
вопросы:
- Массив дат передачи передатчика [60], например: 523 | 487, здесь
int Commands[30];
всего 30, это нормально? if(char(buf[i]) == '|') / Commands[column] = message.toInt();
, кажется, просто конвертирует дату перед '|'?- Каков результат
message += char(buf[i]);
?
Спасибо
@laoadam, 👍0
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.
- Есть ли какой-нибудь способ загрузить скетч с ардуино?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Асинхронные вызовы функций в скетче ардуино
- Проблема с загрузкой моего скетча на Ардуино
- Что произойдет, если возникнет ошибка времени выполнения?
- Проблема: "stray '#' in program"
- Двигатель постоянного тока шумит, но не вращается
- Цикл While не прерывается
@ Маженко♦ Спасибо, Маженко♦, не могли бы вы обратиться к: https://arduinoprosto.ru/q/62576/please-explain-the-sketch-attached/62579?noredirect=1#comment134324_62579 и посмотреть, какая дата отправил? и посмотреть, есть ли совпадения?, @laoadam