сохранить число пришедшее в порт

saftik
Offline
Зарегистрирован: 08.04.2015

Здраствуйте любители и профессионалы.
у меня несколько нестандартный вопрос. настандартный потому что он очень простой. А я  уже несколько дней как не могу понять в чем проблема.

За основу взят этот скетч который благополучно работает.

int ledPin = 13;   // выбор пина для светодиода
int val = 0;       // переменная для хранения данных из последовательного порта

void setup() {
  pinMode(ledPin,OUTPUT);    // объявить светодиод выходом
  Serial.begin(9600);        // подключиться к последовательному порту
  Serial.println("Welcome to SerialReadBlink!");
}

void loop () {
  val = Serial.read();      // прочитать значение с последовательного порта 

  // если величина - число из одной цифры, мигнуть светодиодом столько раз
  if (val > '0' && val <= '9' ) {
    val = val - '0';       // преобразовать из символа в число
    for(int i=0; i<val; i++) {
      Serial.println("blink!");
      digitalWrite(ledPin,HIGH);
      delay(150);
      digitalWrite(ledPin, LOW);
      delay(150);
    }
  }
}

Собственно вопрос в том ка прочитать число больше 9

saftik
Offline
Зарегистрирован: 08.04.2015

пробовал менять число 9 на большее. тогда если пишу допустим 15 приходит не 15 а число 1 потом 5.

пробовал менять serial.read() на serial.available() тогда в порт ничего не приходит
пробовал менять serial.println(val) на serial.println(val, DEC)
 

знаю что это азы и прошу не посылать меня читать книги по ардуино я их уже читал
помогите разобраться .
для спеца обьяснить это 5 мин вренени. а для меня чтоб найти и понять что к чему займет пару дней ГУГЛения 

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

int val = 0;
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600); 

}

void loop() {
  val = Serial.read();
  if (val > '0' && val <= '20' ) {
    val = val - '0';
    Serial.println(val, DEC);
    }}

пробовал и такой код
 

int incomingInt = 0; 
void setup() 
{
   Serial.begin(9600);
   Serial.setTimeout(200);
}

void loop() 
{
   if (Serial.available() > 0) 
   {
      incomingInt = Serial.parseInt();
      Serial.write(incomingInt);
   }
}

 

saftik
Offline
Зарегистрирован: 08.04.2015

прочитал вот Эту статью.
вот такой код работает только почему-то между отправленными числами 5 строк

char incomingBytes[2];
void setup() 
{
   Serial.begin(9600);
   Serial.setTimeout(40);
}

void loop() 
{
   if (Serial.available() > 0)
   {
      Serial.readBytes(incomingBytes, 2);
      Serial.println(incomingBytes);
   }
}



тоесть допустим не так 

1 первое число 

23 втрое число

а так 

первое число
//


//
// пробел  5строк  не понятно откуда 


//
//
23 
втрое число

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Тут масса решений, из самого простого -можно запихать parseInt  в прерывание ,  правда будет минус - после ввода данных Loop остановится на время заданное в setTimeout. Но вроде не страшная плата за простоту..

void setup(){
Serial.begin(9600);
Serial.setTimeout(5);
}

void loop(){ }

void serialEvent() {
int data_in = Serial.parseInt();
Serial.println(data_in);
}

 

vov4ik
Offline
Зарегистрирован: 10.09.2013
int result = 0; // количество
void setup() {
  Serial.begin(9600);
}
void loop() {
   if (Serial.available()) {
  int com=Serial.parseInt(); // читам
     // выводим что прочитали
      Serial.print("Readed=");
      Serial.println(com);
 result = com;     
      while(Serial.available())Serial.read();// очищаем входящий буффер Serial (перевод каретки и проч. мусор)
  }  
// выполнить действа со значением result
}

 

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

dimax пишет:

можно запихать parseInt  в прерывание 

К прерыванию serialEvent() не имеет никакого отношения, а вызывается она после функции loop(). Возможно я что то пропустил и в последних версиях IDE выше 1.0.х serialEvent() стал всетаки вызываться в прерывании.

dimax пишет:

правда будет минус - после ввода данных Loop остановится на время заданное в setTimeout. Но вроде не страшная плата за простоту..

setTimeout ожидает следующую цифру - именно цифру, если же попадется не цифра parseInt() прерывается и формирует число.

Что бы не ждать setTimeout достаточно в конце отправляемого числа добавить любой символ, например, символ конца строки, если числа отправляются из дуиновского монитора порта, можно в правом нижнем углу выбрать New line вместо No line ending.

saftik
Offline
Зарегистрирован: 08.04.2015

мужики спасибо что отозвались. буду разбираться

saftik
Offline
Зарегистрирован: 08.04.2015

maksim почитал о функции   serialEvent()  видимо функция хорошая но пишут что она не на всех ардуино работает.
"Примечание: в настоящее время функция serialEvent() не совместима с Arduino Esplora, Leonardo и Micro.©

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

Да и не нужна она.

void loop()
{ 
   if (Serial.available() > 0)
   {
      int data_in = Serial.parseInt(); 
      Serial.println(data_in); 
   }
} 

 

saftik
Offline
Зарегистрирован: 08.04.2015

maksim пишет:

Да и не нужна она.

void loop()
{ 
   if (Serial.available() > 0)
   {
      int data_in = Serial.parseInt(); 
      Serial.println(data_in); 
   }
} 

 


спасибо попробую