Как считать нечто осмысленное по SerialRead?

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Помогите считать нечто осмысленное через Монитор порта Arduino IDE. 

Например, я хочу написать в Мониторе порта "15", нажать интер, и arduino выполнит "a=15;". Не могу понять, как сделать это, пробывал, как я прочёл в интернете, аналог Convert, но это не сработало. 

Тут ( http://arduino.ru/Reference/Serial/Print ) написано: 

Для вещественных (дробных) чисел второй параметр задает количество знаков после запятой. Пример:

 

  • Serial.println(1.23456, 2) выводит "1.23"
  • Serial.println(1.23456, 4) выводит "1.2346

Но вот у меня второй параметр определяет разрядность выводимых данных, т.е при параметре 2 мне выводит 1010101011001(пример), при 3 выводит 12010021(пример). Что я делаю не так?

Подскажите, пожалуйста!

maksim
Offline
Зарегистрирован: 12.02.2012

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

http://arduino.ru/forum/programmirovanie/upravlenie-servoprivodom-po-serial#comment-19676

http://arduino.ru/forum/programmirovanie/problema-polucheniya-dannykh-s-seriinogo-porta-arduino#comment-39147

  • print() - предназначен для вывода данных, а не для чтения.
NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Я знаю для чего принт. Я пытаюсь вывести из ардуино значение, но обрезать до двух знаков после запятой - не получается.

То, что тема уже обсуждалась - знаю. Искал сегодня весь день, перечитал не только этот сайт. У меня проблема в том, что не смотря на то, что я даю переменной тип char - ничего не происходит. Он чар, но там те же самые кикоды сидят. Толку их склеивать) Почему-то часто пишут про задачу типа данных как char* (со звездой) но моя Arduino IDE не знает этого и пишет ошибку компилинга. 

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

UPD: Перевёл объявление переменной в самое начало программы, до сетапа - заработало!

Осталось понять, почему не обрезает знаки.

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Забыл спросить в самом начале:

Сколько раз можно прошивать ATMEGA328P-PU ? Как проявится предел? Полный отказ прошиваться или криво прошьётся?

Looka
Offline
Зарегистрирован: 24.04.2012

Покажите код. 

Шейте на здоровье, достаточно много.... 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Вас невозможно понять, выкладывайте код и попробуйте по-человечески обьяснить что хотите сделать.

Вставка программного кода в тему/комментарий

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Сейчас закидаете..... Это тахометр, который считывает данные с ИК оптопары. 

char L=1; // кол-во лопастей либо щелей
unsigned long tPH, tPL, T=0;
double RPM;

void setup()
{
  Serial.begin(9600);     
  digitalWrite(14, HIGH); // этим я подавал питание через резистор на фотодиод
}

void loop()
{
  if (Serial.available() > 0) {
    L = (Serial.read()-'0'); // Пытаюсь присваивать кол-во лопастей из Монитора порта
  }
  for (int i=1; i<=L; i++) {  // Эта часть вроде работает,
    tPL = pulseIn(14, LOW); //  но лично мне кажется, что
    tPH = pulseIn(14, HIGH); // RPM в итоге завышается в 2 раза
    T=T+(tPL+tPH);
  }
  RPM=60000000/T;
  Serial.println(RPM);   
  T=0;
  delay(300);
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

#1 - перечитывайте до тех пор пока не поймете что нужно делать.

maksim
Offline
Зарегистрирован: 12.02.2012
int L = 1; // кол-во лопастей либо щелей
unsigned long tPH, tPL, T = 0;
float RPM;

void setup()
{
  Serial.begin(9600);     
  digitalWrite(14, HIGH); // этим я подавал питание через резистор на фотодиод
  Serial.setTimeout(100);
}

void loop()
{
  if (Serial.available()) L = Serial.parseInt(); // Пытаюсь присваивать кол-во лопастей из Монитора порта
  for (int i = 1; i <= L; i++) 
  {  // Эта часть вроде работает,
    tPL = pulseIn(14, LOW); //  но лично мне кажется, что
    tPH = pulseIn(14, HIGH); // RPM в итоге завышается в 2 раза
    T += tPL + tPH;
  }
  RPM = 60000000 / T;
  Serial.println(RPM);   
  T = 0;
  delay(300);
}

 

Looka
Offline
Зарегистрирован: 24.04.2012

Не уверен что оптимально использовать pulseIn.

Если импульсов не будет, скетч ваш повиснет....

Более красивое решение использовать прерывания.

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Однако, всё очень красиво складывается само собой: При ожидании импульса более 1 секунды в консоль вываливается строка ovf, потом ещё одна, если и ещё одного нет и т.д. Когда импульсы снова появляются программа отрабатывает их как надо.