Как сделать несколько serial.read()

прежде всего, я здесь новичок, и мне очень жаль, если есть какие-то ошибки, когда я задаю этот вопрос. Итак, я пытаюсь создать программу для вычисления с использованием последовательного чтения, и я собираюсь ввести много значений.

Это коды, которые я пытаюсь загрузить, но он не показывает входные данные.

int PpmNeed;
int Ppmpertank;
int nyala;
int tangki;
int sensor;
int mlkeluar;
int perlakuan;
void setup() {
  Serial.begin(115200);
  Serial.setTimeout(10);
}

void loop() {
    Serial.println("Besar Tangki");
    while(Serial.available() == 0){}
    tangki = Serial.parseInt();
    
    Serial.println("Kadar Dari Sensor");
    while(Serial.available() == 0){}
    sensor = Serial.parseInt();
    
    Serial.println("Data Perlakuan");
    while(Serial.available() == 0){}
    perlakuan = Serial.parseInt();
   
    Serial.print("Besar Tangki : ");
    Serial.println(tangki);
    Serial.print("Kadar Dari Sensor : ");
    Serial.println(sensor);
    Serial.print("Data Perlakuan : ");
    Serial.println(perlakuan);
}

, 👍1

Обсуждение

Какие данные вы пишете для анализа программой?, @Kingsley


3 ответа


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

1

Хотя ваш способ считывания входных данных от пользователя неоптимален, чтобы он работал, вы должны прочитать символы новой строки, которые отправляет Serial Monitor (если в раскрывающемся списке выбрано окончание строки).

Символы новой строки доступны в Serial после цифр, поэтому они делают

while(Serial.available() == 0){}

немедленно покончить с этим.

Вы можете исправить это, прочитав символы, заканчивающиеся в конце строки.

int PpmNeed;
int Ppmpertank;
int nyala;
int tangki;
int sensor;
int mlkeluar;
int perlakuan;
void setup() {
  Serial.begin(115200);
  Serial.setTimeout(10);
}

void loop() {
    Serial.println("Besar Tangki");
    while (Serial.available()) {
      Serial.read();
    }
    while(Serial.available() == 0){}
    tangki = Serial.parseInt();
    
    Serial.println("Kadar Dari Sensor");
    while (Serial.available()) {
      Serial.read();
    }
    while(Serial.available() == 0){}
    sensor = Serial.parseInt();
    
    Serial.println("Data Perlakuan");
    while (Serial.available()) {
      Serial.read();
    }
    while(Serial.available() == 0){}
    perlakuan = Serial.parseInt();
   
    Serial.print("Besar Tangki : ");
    Serial.println(tangki);
    Serial.print("Kadar Dari Sensor : ");
    Serial.println(sensor);
    Serial.print("Data Perlakuan : ");
    Serial.println(perlakuan);
}
,

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


3

Ваша проблема в том, что люди медлительны. Очень медленно.

Такие функции, как Serial.parseInt() и т.д., предназначены для считывания данных с датчиков. Таким образом, они ожидают, что данные будут поступать быстро. У них есть тайм-аут, по которому они будут прерваны, если данные не поступят своевременно.

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

Вместо этого вам нужно будет написать процедуру (или найти ее в Интернете, например, ту, которую я показываю здесь), которая останавливается и ожидает ввода, прежде чем затем проанализировать данные и продолжить.

Если вы взаимодействуете с последовательным терминалом, а не с последовательным "монитором" Arduino IDE, то также может быть полезно повторять символы по мере их получения, чтобы человек, набирающий текст, мог видеть, что он ввел. Редактирование строк (или, по крайней мере, базовая обработка обратного пробела) также было бы полезно и в этой ситуации.

,

но последовательный монитор отправляет строку сразу, и там есть while(Serial.available() == 0) {}, @Juraj

@Juraj Я не упомянул тот факт, что parseInt() не использует окончания строк..., @Majenko

но он "Ищет следующее допустимое целое число во входящем последовательном номере"., @Juraj

Я проверил это. \n вызывает while(Serial.available() == 0){} пропустить, @Juraj


0

короткая функция для чтения пользовательских вводимых данных. не суслите, если пользователь отправляет несколько номеров одновременно

ИСПОЛЬЗУЙТЕ ТОЛЬКО ДЛЯ ЧЕЛОВЕЧЕСКОГО ВВОДА.

#define NOP __asm__ __volatile__ ("nop\n\t")


//Считывание следующего числа
int nextNumber() {
  int input = 0;

  //дождитесь следующего байта
  while (Serial.available() == 0) {NOP;}
  
  /read number
  input = Serial.parseInt();
  
  //Дайте некоторое время, чтобы байты прошли через последовательную шину, затем удалите его
  delay(1);
  while (Serial.available() > 0) {
    int incomingByte = Serial.read();
  }
  return input;
}
,

В `NOP" нет никакой пользы., @Edgar Bonet