Вывод/чтение в СОМ значений, пересчёт

Pavel_1282
Offline
Зарегистрирован: 19.12.2012

Мне нужно сделать что-то типа консоли на основе "монитора порта" т.е. иными словами вводишь значения коэфф N, потом R прям с клавиатуры программа пересчитывает по формуле и выдает значение F.  Все вроде работает но есть один глюк часто "монитор порта"  требует несколько раз ввести одно и тоже значение N или тут же вводит R c F, а бывает всё норм N вводишь потом R  и тут же выдается F. Вот текст программы:

int N;
int R;
float F;
byte index;
char inData[20];

void setup()
{
Serial.begin(9600); //установка порта на скорость 9600 бит/сек
//noInterrupts();
}
void loop()
{
if (Serial.available()>0)
{
if(index < 19)
{
N = Serial.read();

inData[index] = N;
index++;
inData[index] = '\0';
Serial.print ("Enter N:");
Serial.println (N);
delay (1000);
}}

if (Serial.available()>0)
{
R = Serial.read();
F = Serial.read();
F = (float)N / R;

Serial.print ("Enter R:");
Serial.println (R);
delay (500);
Serial.print ("Result F:");
Serial.println (F);
}}

 

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

Честно говоря не понятно что вы хотите от этого кода. Посмотрите ка здесь.

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

Может этого?

void setup()
{
  Serial.begin(9600);
}
void loop()
{
  Serial.print ("Enter N: "); 
  while(!Serial.available());
  int N = Serial.parseInt();
  Serial.println(N);
  Serial.print("Enter R: ");
  while(!Serial.available());
  int R = Serial.parseInt();
  Serial.println(R);
  float F = (float)N / R;
  Serial.print("Result F: ");
  Serial.println(F);
  Serial.println();
}

 

Pavel_1282
Offline
Зарегистрирован: 19.12.2012

Да) Спасибо большое!!!

Pavel_1282
Offline
Зарегистрирован: 19.12.2012

Так понимаю что нужно было в нужным местах раставить операторы, а не как я сделал

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

Нет, вы пытались сами прочитать буфер, поместив его в массив, потом не верно склеивали число, так как у вас программа больше ничего не делает, то можно воспользоваться Serial.parseInt();, которая все сделает за вас и вернет вам готовое число, но это блокирующая функция - то есть пока она работает остальное ждет. И по этой же причине в вашем случае проще написать while(!Serial.available()); - то есть программа крутится в цикле и ждет пока что-нибудь не прийдет по сериал.

Pavel_1282
Offline
Зарегистрирован: 19.12.2012

Serial.parseInt() - перводит в десятичные числа а не в этот аски-код

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

Serial.parseInt() - переводит ASCII-коды в цифры и склеивает их в число.

 

Pavel_1282
Offline
Зарегистрирован: 19.12.2012

Да очень удобный этот оператор Serial.parseInt() особенно когда работаешь в терминале (консоле) допустим мы делали ФАПЧ кот управляется от терминала и как раз оператор этот пригодился