#1 2016-09-11 02:09:19

Oleh
Учасник
Зареєстрований: 2016-09-11
Повідомлень: 2

Помогите начинающему.

Вчера купил ардуинку и сегодня первый день программирую, поэтому прошу ногами сильно не пинать smile
Задача стоит такая. Необходимо через монитор два раза отправить в ардуинку один и тот же символ и после этого вывести в монитор время, которое прошло между приходами этих символов. Вот, что у меня получилось. Светодиод только для наглядности. В принципе, он не нужен.


int outputPin = 2; //здесь храним номер контакта
int val; //здесь будет храниться принятый символ
unsigned long timeS=0;//начало отсчета
unsigned long timeF;//конец отсчета
unsigned long result;

void setup()
{
  Serial.begin(9600);              //установка порта на скорость 9600 бит/сек
  pinMode(outputPin, OUTPUT);      //устанавливаем 2 контакт в режим вывода
}

void loop()
{
  if (Serial.available()>0) {         //если есть принятый символ,
    val = Serial.read();            //  то читаем его и сохраняем в val, буфер должен очиститься
    if (val == 's'){               //  если принят символ 's',...
      digitalWrite(outputPin, HIGH);//  то включаем светодиод
      timeS = millis();//и сохраняем время старта
      Serial.println(timeS);//печатаем время старта
     
     
    }
    if ((timeS>0)&&( val == 's')) {    //  если снова принят символ 's',
      digitalWrite(outputPin, LOW); //    то выключаем светодиод
      timeF = millis();//сохраняем время финиша
      Serial.println(timeF);
    }
    if (timeF >0) {
      result = timeF - timeS;//вычисляем результат
      Serial.print("Result  ");
      Serial.print(result);
     
    }
  }
}

По первому введению "s" два раза выводится одинаковое время(иногда отличается на 1мкс) и, соответственно результат ноль. У меня ощущение, что буфер не очищается при считывании из него "s" в первый раз. Какой-то специальной команды для очистки буфера я не обнаружил. Может что-то другое? ХЕЛП!
Пы.сы. Если для старта и финиша применять разные символы, то все работает.

Неактивний

#2 2016-09-11 07:26:32

micom
Учасник
Зареєстрований: 2016-08-24
Повідомлень: 4

Re: Помогите начинающему.

При получении первого 's' переменные принимают такие значения: val = 's', timeS=времяПриходаПервогоСимвола. Это происходит в первом if.
Подошли ко второму if. Напоминаю, что val = 's', timeS=времяПриходаПервогоСимвола. Условие выполнится. Но не так и не тогда как подразумевалось - не во время прихода второго символа, а сразу после прочтения первого 's'. И в timeF запишется просто этот момент, разница в 0 мкс.
Нужно что-то менять.
Например, ввести вместо val   val1 и val2. Первый символ писать в val1, второй в val2, при получении второго символа произвести вычисления, и не забыть очистить val1 и val2. Или переместить timeF в timeS, а val2  и timeF очистить в случае, если нужно будет ждать третий 's' и более. При этом нужно помнить как выполняется программа, чтобы не повторить предыдущую ошибку.
Буфер очищается сам после чтения. Прочитан символ, второй раз его не прочитать.

Остання редакція micom (2016-09-11 08:11:57)

Неактивний

#3 2016-09-11 12:21:15

Oleh
Учасник
Зареєстрований: 2016-09-11
Повідомлень: 2

Re: Помогите начинающему.

Спасибо большое. Понял свою ошибку, переделал, заработало!
Теперь скетч выглядит так
int outputPin = 2; //здесь храним номер контакта
char val,val1; //здесь будет храниться принятый символ
unsigned long timeS=0;//начало отсчета
unsigned long timeF;//конец отсчета
unsigned long result;

void setup()
{
  Serial.begin(9600);              //установка порта на скорость 9600 бит/сек
  pinMode(outputPin, OUTPUT);      //устанавливаем 2 контакт в режим вывода
}

void loop()
{
 
   while(val != 115){
    val = Serial.read();}            //   крутимся в цикле пока в буфер не придет "s"
   
                  //  если принят символ 's',...
      digitalWrite(outputPin, HIGH);//  то включаем светодиод
      timeS = millis();//и сохраняем время старта
      Serial.print("Start  ");
      Serial.println(timeS);//печатаем время старта
      val=0;
     
   while(val != 115){   // снова крутимся в ожидании символа 's',
    val = Serial.read();}     
      digitalWrite(outputPin, LOW);
      timeF = millis();//сохраняем время финиша
      Serial.print("Finish  ");
      Serial.println(timeF);
   
   
      result = timeF - timeS;//вычисляем результат
      Serial.print("Result  ");
      Serial.println(result);
     timeS=timeF;
  }

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму