Serial соединение и blink

artemik
Offline
Зарегистрирован: 10.03.2012

Кто подскажет? Требуется зажигать светодиод (три состояния: светится/не светится и мигает) через ком-порт. Не пойму с do..while, какое условие должно быть? 

int led_pin=11;
int value=0;

void led_mix() //функция мигания св.диода
  {
  do
  {
  digitalWrite(led_pin, HIGH);
  delay(200);
  digitalWrite(led_pin, LOW);
  delay(200);
  }
  while (какое условие здесь должно быть???);
  }

void setup()
  {
  Serial.begin(9600);
  pinMode(led_pin, OUTPUT);
  }
  
  void loop()
    {
      value=Serial.read();
      switch (value)
      {
        case 'H': digitalWrite(led_pin, HIGH); break;
        case 'L': digitalWrite(led_pin, LOW); break;
        case 'M': led_mix(); break;
      } 
    }
maksim
Offline
Зарегистрирован: 12.02.2012

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

int led_pin=11;
int value=0;

void led_mix() //функция мигания св.диода
{
  digitalWrite(led_pin, HIGH);
  delay(200);
  digitalWrite(led_pin, LOW);
  delay(200);
}

void setup()
{
  Serial.begin(9600);
  pinMode(led_pin, OUTPUT);
}

void loop()
{
  if(Serial.available()){
    delay(2);
    value=Serial.read();
  }
  switch (value)
  {
  case 'H': 
    digitalWrite(led_pin, HIGH); 
    break;
  case 'L': 
    digitalWrite(led_pin, LOW); 
    break;
  case 'M': 
    led_mix(); 
    break;
  } 
}

но можно пойти и по вашему пути - цикл пока буфер пуст:

int led_pin=11;
int value=0;

void led_mix() //функция мигания св.диода
  {
  do
  {
  digitalWrite(led_pin, HIGH);
  delay(200);
  digitalWrite(led_pin, LOW);
  delay(200);
  }
  while (!Serial.available());
  }

void setup()
  {
  Serial.begin(9600);
  pinMode(led_pin, OUTPUT);
  }
  
  void loop()
    {
      value=Serial.read();
      switch (value)
      {
        case 'H': digitalWrite(led_pin, HIGH); break;
        case 'L': digitalWrite(led_pin, LOW); break;
        case 'M': led_mix(); break;
      } 
    }

 

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

Или все вместе

int led_pin=11;
int value=0;

void led_mix() //функция мигания св.диода
{
  do
  {
    digitalWrite(led_pin, HIGH);
    delay(200);
    digitalWrite(led_pin, LOW);
    delay(200);
  }
  while (!Serial.available());
}

void setup()
{
  Serial.begin(9600);
  pinMode(led_pin, OUTPUT);
}

void loop()
{
  if(Serial.available()){
    delay(2);
    value=Serial.read();
    switch (value)
    {
    case 'H': 
      digitalWrite(led_pin, HIGH); 
      break;
    case 'L': 
      digitalWrite(led_pin, LOW); 
      break;
    case 'M': 
      led_mix(); 
      break;
    } 
  }
}

 

artemik
Offline
Зарегистрирован: 10.03.2012

где-то ошибка, светодиод после посыла "М" моргает один раз и гаснет... Во всех скетчах.

artemik
Offline
Зарегистрирован: 10.03.2012

странно, проверил на putty всё работает, а через ардуино иде не работает) тема закрыта, maksim спасибо