для увеличения скорости чтения и записи/печати данных с Arduino Nano на Raspberry Pi 3B+

В моем проекте мне нужно прочитать номер входного контакта (отправленный RPi), где 8 датчиков подключены к Arduino Nano, после считывания Arduino Nano отправляет значения всех датчиков в реальном времени через последовательную связь USB. Все хорошо, но моя проблема в том, что мне нужно ускорить отправку данных, так как чтение из Rasberry pi занимает много времени. Я ставлю задержку 70 миллисекунд, но если я пытаюсь уменьшить больше, я сталкиваюсь с проблемой, т.е. данные перезаписываются. У меня скорость 115200. Пожалуйста, помогите мне с кодом, чтобы сделать это быстро.

int analogInputPin;
float voltage;

void setup() {
  // инициализируем последовательную связь на скорости 9600 бит/с:
  Serial.begin(115200);
}

void loop() {
  // если какие-либо данные по последовательному порту доступны
  // читаем и пытаемся обновить аналогInputPin
  // на основе числа, которое было прочитано в сериале
  if (Serial.available() > 0) {
    analogInputPin = Serial.parseInt();
  }

  // прочитать аналоговое значение:
  int analogInputPinValue = analogRead(analogInputPin);
  voltage=(5./1023.)*analogInputPinValue;

  // вывод результатов в последовательный порт:
  // вывод должен иметь следующий вид: INPUTPIN:VALUE
  // за которым следует символ новой строки
  Serial.print(analogInputPin);
  Serial.print(":");
  Serial.print(voltage);
  Serial.println("");

  // ждем 50 миллисекунд перед следующим циклом
  delay(50);
}

, 👍0

Обсуждение

Подсказка: посмотрите исходный код Serial.parseInt(). Вместо этого рассмотрите возможность чтения в буфер., @Mikael Patel

Не используйте parseInt. Всегда. Это прогоркло. Прочитайте сериал *правильно*: https://majenko.co.uk/blog/reading-serial-arduino, @Majenko


1 ответ


1

parseInt считывает цифры и останавливается после появления нецифровых символов или после истечения времени ожидания функции из-за отсутствия следующих символов. Тайм-аут по умолчанию составляет 1 секунду. Так что здесь вы теряете время.

Самое простое решение для вашего кода — отправить нецифровой символ после числа, отправленного из Raspberry. Это немедленно завершит работу parseInt. Обычно это отправка символа новой строки. Это будет хорошо разделять числа, если вы отлаживаете связь с печатью на последовательном терминале.

Не очень хороший вариант, но я упомянул о нем, это установить меньшее время ожидания блокировки функций чтения, таких как parseInt, с помощью Serial.setTimeout(ms).

Чтобы действительно ускорить общение, вы должны отправлять числа в двоичной форме, а не в виде текста, как сейчас.

,