Ви не увійшли.
Сторінки 1
Вчера купил ардуинку и сегодня первый день программирую, поэтому прошу ногами сильно не пинать
Задача стоит такая. Необходимо через монитор два раза отправить в ардуинку один и тот же символ и после этого вывести в монитор время, которое прошло между приходами этих символов. Вот, что у меня получилось. Светодиод только для наглядности. В принципе, он не нужен.
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" в первый раз. Какой-то специальной команды для очистки буфера я не обнаружил. Может что-то другое? ХЕЛП!
Пы.сы. Если для старта и финиша применять разные символы, то все работает.
Неактивний
При получении первого '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)
Неактивний
Спасибо большое. Понял свою ошибку, переделал, заработало!
Теперь скетч выглядит так
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;
}
Неактивний
Сторінки 1