отправка целых чисел через последовательный в Arduino - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь послать целые числа через последовательный порт, используя последовательный монитор в IDE ardunio (затем python от raspberry pi после отладки, используя последовательный монитор), и могу получить отдельные числа для работы с кодом ниже, но как только яиспользуйте 10 или 100, это автоматически заполнит следующую переменную как 0. Я попытался использовать serial.readString, а затем преобразовать в int, но это также выдает ошибку.

int varX = 0;
int varY = 0;
int varZ = 0;
int varCounter = 0;


void setup() {
  Serial.begin(115200);
  grabNewVars();
}

void grabNewVars()
{
  while (varCounter < 3)
  {
    if (Serial.available() > 0) {
      if (varCounter ==0)
      {
      varX = Serial.parseInt();
      }
      if (varCounter ==1)
      {
      varY = Serial.parseInt();
      }
      if (varCounter ==2)
      {
      varZ = Serial.parseInt();
      }
   varCounter++;
    }
  }
}

void loop() 
{
  Serial.println("varX = " + String(varX));
  Serial.println("varY = " + String(varY));
  Serial.println("varZ = " + String(varZ));
  Serial.println("variables received, run main loop");
  delay(100000);

}

1 Ответ

1 голос
/ 18 октября 2019

Давайте подумаем о том, что делают ваши функции.

Serial.available () возвращает количество байтов, доступных в буфере приема.

Serial.parseInt () читает любую цифру допринимается нецифровый символ или он истекает, если в течение 1 секунды не получено ни одной цифры (по умолчанию)В этом случае он возвращает 0.

Таким образом, в цикле while вы ждете, пока что-то окажется в приемном буфере, проверяя Serial.available() > 0.

Вы вводите 100 (без окончания строки). Теперь, когда что-то находится в приемном буфере, а varCounter равен 0, вы выполняете varX = Serial.parseInt();

parseInt через тайм-аут через 1 секунду и возвращает 100, которые были получены в течение этой 1 секунды.

100 сохраняется в varX, а varCounter увеличивается на 1.

Теперь вы выполняете varY = Serial.parseInt();

Поскольку вы, скорее всего, не ввели другой номер в течение секунды, это приведет к истечению времени ожидания, и вы 'сохранит 0 в переменной.

Завершите свой номер нецифровым символом. Например, выбрав конец строки в последовательном мониторе или отправив новую строку или возврат каретки из кода Python. Или любой другой нецифровый символ. Таким образом, Arduino узнает, что полное целое число получено, и ему не нужно ждать, пока не истечет время ожидания.

Если вы хотите, чтобы ваш код ожидал вашего следующего ввода вечно, отметьте Serial.available > 0 перед следующим вызовомдо parseInt. Вы уже прочитали каждый номер из буфера приема, поэтому вызов parseInt сразу не имеет смысла, если вы точно не знаете, что в течение секунды получите другой номер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...