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
. Пожалуйста, помогите мне в этом.
@Kishore, 👍0
Обсуждение1 ответ
Лучший ответ:
Это то, что вы хотите:
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
- Как автоматически сбросить nrf24l01+ с кодом?
- nRF24L01 + потеря пакетов, вызванная считыванием Arduino и связью с датчиками
- Как связаться с GPS SIM900a без serial monitor
- Сообщение передается несколько раз от одного arduino к другому с помощью nRF24L01
- Задержка связи основного узла RF24Mesh
- Проблема последовательной связи RS-485 с arduino
- Что может привести к тому, что данные будут напечатаны правильно, затем неправильно, а затем повторятся? CAN-шина/общая передача
- nRF24L01 - пропускает конечные символы во время передачи
я думаю, что у Serial.available() есть тайм-аут в несколько секунд, прежде чем он решит, что данных больше нет, @jsotola
Я смущен. вы отправляете по радио двоичный буфер длиной 7 байт. а затем вы печатаете содержимое буфера в виде чисел на локальный последовательный монитор и анализируете данные из последовательного монитора. вы вводите числа в Serial Monitor? каждый Serial.parseInt ждет секунду числа, отправленного из Serial Monitor, @Juraj
@jsotola Serial.available возвращает количество полученных байтов (и находящихся в буфере приема последовательного порта в ожидании чтения). Вот и все, больше ничего., @Jot
@Juraj Да, я ввожу цифры в последовательном мониторе. Я печатаю его, чтобы просто отслеживать значения в массиве, чтобы они совпадали на стороне получателя. Если я введу число «2» и подожду несколько секунд, время ожидания автоматически истечет, а все остальное станет нулями. Я хочу, чтобы он бесконечно ждал ввода пользователя., @Kishore