Как в Arduino через сериал задать 2 значения для двух переменных?

drevoc
Offline
Зарегистрирован: 12.08.2016

Подскажите пожалуйсто, почему кодом ниже не удается задать время переменные часа и минут?

 

int h=0,m=0, s=0;
char c1,c2;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("write Hour");
delay (5000);
while (Serial.available() > 0) {
// считываем принятый байт:
c1 = Serial.read();
h =atoi(c1);
}

Serial.println("write Min");
delay (5000);
while (Serial.available() > 0) {
// считываем принятый байт:
c2 = Serial.read();
m =atoi(c2);
}
} 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А откуда Вы знаете, что не удаётся? Вы его запускали? Ну, тогда Вы должны знать, что, для начала, он просто не компилируется. Это достаточная причина, чтобы с его помощью нельзя было что-то задать?

drevoc
Offline
Зарегистрирован: 12.08.2016

Все компилируется! В LOOP у меня вывод стоит. ниже полный код:

int h=0,m=0, s=0;
char c1,c2;

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
Serial.println("write Hour");
  delay (5000);
 while (Serial.available() > 0) {
                // считываем принятый байт:
                c1 = Serial.read();
                 h =atoi(c1);
  }
  
  Serial.println("write Min");
    delay (5000);
  while (Serial.available() > 0) {
                // считываем принятый байт:
                c2 = Serial.read();
                m =atoi(c2);
  }
}
  

void loop() {
  

  
  Serial.print(h);
  Serial.print(":");
  Serial.print(m);
  Serial.println("\n");
  delay (1000);
}

 

drevoc
Offline
Зарегистрирован: 12.08.2016

ответ коментарием ниже

b707
Offline
Зарегистрирован: 26.05.2017

а как передаете байты?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

drevoc пишет:

Все компилируется! 

Т.е. Вы хотите сказать, что строки 12 и 20 у Вас не вызывают ошибки компиляции? 

Отсюда я делаю вывод: Вы используете IDE типа 1.8.x с настройками по умолчанию. Авторы специально поиздевались над новичками, сделав две вещи: 1) включили опции так, что большинство критических ошибок выдаются как предупреждения и 2) полностью подавили вывод этих самых предупреждений, чтобы не люди работали вслепую.

Зайдите в "Настройки", найдите там "Сообщения компилятора" и уберите нахрен лоховское "ничего". Поставьте уже если не "всё", то хотя бы "по умолчанию". 

Получите "предупреждение", но на самом деле это никакое не предупреждение, а сообщение о критической ошибке. В более адекватных версиях IDE Вы бы получили его сразу.

b707
Offline
Зарегистрирован: 26.05.2017

я смотрю, вы на Амперке уже исправленный код выложили. Вы бы лучше выбрали один форум для вопроса, а то какое-то читерство получается

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

а как передаете байты?

Какая разница, если он читает побайтно (представьте, что часов 23) и каждый прочитайнный байт передаёт atoi у которой параметр вообще-то не байт, а const char *

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Какая разница, если он читает побайтно (представьте, что часов 23) и каждый прочитайнный байт передаёт atoi у которой параметр вообще-то не байт, а const char *

ну вообще-то у него параметр atoi и описан как char так что особой проблемы быть не должно.  (UPD - упс. притупил... удалять не буду. но ошибку понял)

 

А чтение двухзначных чисел он уже добавил... на амперке

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Сегодня меня укусила бацилла альтруизма. Плюс к тому ТС настолько невежественен, что объяснять бесполезно.

Вот код. Минимальные правки к коду ТС, может это поможет ему понять отличие?

int h=0,m=0, s=0;
char c[16];
byte i;

void setup() {
  // put your setup code here, to run once:
Serial.begin(57600);
while (!Serial);
Serial.println("write Hour");
  delay (5000);
i = 0;
 while (Serial.available() > 0) {
                // считываем принятый байт:
                c[i++] = Serial.read();
  }
  c[i] = 0;           
  h =atoi(c);
  
  
  Serial.println("write Min");
    delay (5000);
i = 0;  
while (Serial.available() > 0) {
                // считываем принятый байт:
                c[i++] = Serial.read();
  }
  c[i] = 0;
  m =atoi(c);
}
  

void loop() {
  

  
  Serial.print(h);
  Serial.print(":");
  Serial.print(m);
  Serial.println("\n");
  delay (1000);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

Сегодня меня укусила бацилла альтруизма. 

Прививки надо вовремя делать.

drevoc
Offline
Зарегистрирован: 12.08.2016

Огромное спасибо. Данный код заработал.

Единственное, не могли бы вы обьяснить как работают следующие строки:

1) c[i++] = Serial.read();

2)c[i] = 0;

3) h =atoi(c);

drevoc
Offline
Зарегистрирован: 12.08.2016

Код там я действительно подправил, но он все-равно не работает.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

drevoc пишет:

Огромное спасибо. Данный код заработал.

Единственное, не могли бы вы обьяснить как работают следующие строки:

Меня, конечно, укусила бацилла альтруизма, но не до такой же степени....

Чтение учебника приведет тебя к победе, друг мой!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

drevoc пишет:

не могли бы вы обьяснить как работают следующие строки:

1) c[i++] = Serial.read();

2)c[i] = 0;

3) h =atoi(c);

wdrakula попал!

Говорили ж 

ЕвгенийП пишет:

Прививки надо вовремя делать.