Serial.parseInt() занимает больше времени, чем хотелось бы

Весь мой код для мастера. Пожалуйста, перейдите к void read(), где я использовал parseInt()

#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>
#include <SPI.h>

RF24 radio(7, 8); //Настраиваем nRF24L01 на выводе CE и CSN соответственно

const uint64_t pipe = 0x0ABCDEF; //Адрес для связи между мастером и слейвом
uint16_t data[7];
const uint16_t buffer_size = sizeof(data); //Размер полезной нагрузки для РФ
int i, flag;
int tx_counter = 0;


void read();
void setup() {

  Serial.begin(115200);

  radio.begin();
  radio.setChannel(2);
  radio.setDataRate(RF24_1MBPS);
  radio.setPALevel(RF24_PA_MIN);
  //радио.powerUp();
  radio.openWritingPipe(pipe);
  //radio.setPayloadSize(7);
  radio.stopListening();


  //Значение по умолчанию находится в диапазоне от 100 до 700
  for (i = 0; i < 7; i++) {
    data[i] = 100 + (100 * i);
  }
  flag = 0;
  Serial.println("Enter 7 values");
}

void loop() {

  read();

  if (flag) {
    bool tx_ok = radio.write(data, buffer_size);
    tx_counter++;
    Serial.print("Transmission count:\t");
    Serial.println(tx_counter);
    print();
    if (tx_ok) {
      Serial.println("Transmitted Successfully");
      Serial.println("\nEnter Next set of 7 numbers");
    }
    else Serial.println("Transmission failed");

  }
}

void print() {
  for (i = 0; i < 7; i++) {
    Serial.println(data[i]);
  }
  flag = 0;
}

void read() {
  while (Serial.available()) {
    for (i = 0; i < 7; i++) {
      data[i] = Serial.parseInt();      
    }
    flag = 1;
  }
}

Моя проблема в том, что Serial.parseInt() занимает некоторое время. Через некоторое время код выводит значения на последовательный монитор. Я засек время, и оно составляет около 7 секунд. На странице Arduino в этой функции указано, что тайм-аут по умолчанию составляет 1 секунду. Итак, я думаю, что 7 элементов в массиве занимают 1 секунду каждый. Если я использую Serial.setTimeout(2000), то же самое займет 14 секунд.

Этот путь должен быть проще. Я хочу, чтобы он вёл себя так же, как когда мы используем Serial.read. Пожалуйста, помогите мне в этом.

, 👍0

Обсуждение

я думаю, что у Serial.available() есть тайм-аут в несколько секунд, прежде чем он решит, что данных больше нет, @jsotola

Я смущен. вы отправляете по радио двоичный буфер длиной 7 байт. а затем вы печатаете содержимое буфера в виде чисел на локальный последовательный монитор и анализируете данные из последовательного монитора. вы вводите числа в Serial Monitor? каждый Serial.parseInt ждет секунду числа, отправленного из Serial Monitor, @Juraj

@jsotola Serial.available возвращает количество полученных байтов (и находящихся в буфере приема последовательного порта в ожидании чтения). Вот и все, больше ничего., @Jot

@Juraj Да, я ввожу цифры в последовательном мониторе. Я печатаю его, чтобы просто отслеживать значения в массиве, чтобы они совпадали на стороне получателя. Если я введу число «2» и подожду несколько секунд, время ожидания автоматически истечет, а все остальное станет нулями. Я хочу, чтобы он бесконечно ждал ввода пользователя., @Kishore


1 ответ


Лучший ответ:

0

Это то, что вы хотите:

void read() {
  for (i = 0; i < 7; i++) {
    while (!Serial.available()); // wait forever for some input
    data[i] = Serial.parseInt();      
  }
  flag = 1;
}
,

Спасибо за это. Работает, за исключением небольшой проблемы. Первое передаваемое значение равно «0». И если после каждой передачи я ввожу следующий набор целых чисел достаточно быстро, этого не происходит. Образец полученного значения, показывающий это 0 8 84 51 162 21 651 , @Kishore