Значение чтения последовательного монитора в зависимости от задержки

Я работаю над небольшим фрагментом кода, как показано ниже:

Когда я ввожу символ 'a' в Serial Monitor и использую задержку между последовательными чтениями, монитор выдает приемлемые результаты (например, 97 для символа 'a' и 10 для новой строки), как показано ниже:

Принимая во внимание, что если я не включаю задержку, похоже, что микроконтроллер не может сразу прочитать следующее значение (например, 10 для новой строки) и просто выдает -1. И только после повторного запуска цикла мы видим значение 10 для новой строки (снова с -1).

Верно ли мое наблюдение? Если да, то из-за чего это происходит?

EDIT: приносим извинения за неправильный формат отображения кода. Я добавляю код, как показано ниже:

#include <Wire.h>

void setup() {

  // Инициализировать связь I2C в качестве мастера
  Wire.begin();
  // Настройка последовательного монитора
  Serial.begin(9600);
  Serial.println("I2C Master Demonstration");
}

void loop() {

  if(Serial.available()>0)
  { 
    char c = Serial.read();
    Serial.print((int)c);
    delay(10);            
    char d=Serial.read();  
    Serial.print((int)d);
    Serial.println("Writing data to slave...");  
}
}

, 👍-4

Обсуждение

пожалуйста, опубликуйте текст кода, а не изображения кода ... вас спросили о том же в предыдущем посте, @jsotola

Хорошо, я подумаю об этом в следующий раз... Я подумал, что графическое изображение облегчит интерпретацию!, @Bhuvnesh

это очень затрудняет проверку вашего кода, чтобы увидеть, компилируется ли он вообще., @jsotola

Являются ли минусы только из-за неправильного отображения кода? Или из-за самого вопроса?, @Bhuvnesh

возможно, вы еще покажете картинки кода... если вы уберете картинки и минусы поменяются местами, то у вас будет свой ответ, @jsotola


1 ответ


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

1

Да, UART намного медленнее ЦП, и вы запускаете его на очень низкой скорости передачи данных. ЦП выполняет много циклов, прежде чем Serial. available() снова станет больше 0.

Из ссылки на функцию read():

Возвращает первый байт доступных последовательных данных (или -1, если данных нет).

,

Но почему здесь «-1»? Что это означает?, @Bhuvnesh

я расширил ответ, @Juraj

-1 работает на 100% правильно только для типа данных int... int c = Serial.read();... причина в том, что -1 является двоичным 11111111 в виде байта (255 десятичных)... это 1111111111111111 как целое число... если вы получите действительный "байт" из 255, ваш код увидит это как означающее "нет данных"... если вы получите его как "целое число", тогда ваш код увидит его как data ... int 255 = binary 0000000011111111 .... ваш код получает байты (char), поэтому у вас могут возникнуть проблемы с char (255), @jsotola