Arduino Mega обмен данными ожидание serial monitor

roccosiffredi
Offline
Зарегистрирован: 22.06.2012

//ДШИ 1 ГОРИЗОНТАЛЬ////////////////////////
int dirpin1 = 10;
int steppin1 = 11;
int leftPin1 = 67;
int rightPin1 = 68;
int Stop1 = 54;
int Stop2 = 55;

//ДШИ 2 ВЕРТИКАЛЬ////////////////////////
int dirpin2 = 12;
int steppin2 = 13;
int downPin2 = 66;
int upPin2 = 65;
int Stop3 = 56;
int Stop4 = 57;

int speedPin1 = 63;           // pin1 скорости
int speedPin2 = 64;           // pin2 скорости
int datch = 9;                // pin касания
int magn = 53;                // pin столика
int stol = 69;                // pin кнопки стола
int diod = 62;                // pin диод касания

int rele = 52;                // pin реле
int brak1 = 50;               // pin брака1 по току
int brak2 = 51;               // pin брака2 по току
int signbrak1 = 48;           // pin1 сигнала брака по току
int signbrak2 = 49;           // pin2 сигнала брака по току

int rstate, lstate, ustate, dstate = 0;

int i, a, b, c, d, e, spPin1, spPin2, rval, lval, rightStop, leftStop, uval, dval, upStop, downStop, S, V, dat, sto, sstate, sb;

char direct[3];      //3
char st[6];          //6
char sp[2];          //2
char buffer[12];     //12

void setup() 
{
  Serial.begin(9600);

  pinMode(dirpin1, OUTPUT);
  pinMode(steppin1, OUTPUT);
  pinMode(rightPin1, INPUT);
  pinMode(leftPin1, INPUT);
  pinMode(Stop1, INPUT);
  pinMode(Stop2, INPUT);

  pinMode(dirpin2, OUTPUT);
  pinMode(steppin2, OUTPUT);
  pinMode(downPin2, INPUT);
  pinMode(upPin2, INPUT);  
  pinMode(Stop3, INPUT);
  pinMode(Stop4, INPUT);

  pinMode(speedPin1, INPUT);
  pinMode(speedPin2, INPUT);
  pinMode(datch, INPUT);
  pinMode(magn, OUTPUT);
  pinMode(stol, INPUT);
  pinMode(diod, OUTPUT);


  pinMode(rele, OUTPUT);
  pinMode(brak1, OUTPUT);
  pinMode(brak2, OUTPUT);
  pinMode(signbrak1, OUTPUT);
  pinMode(signbrak2, INPUT);
}

void loop()
{
  int k = 0;  

  a = 20;                                      // СКОРОСТЬ1
  b = 100;                                     // СКОРОСТЬ2 ШАГОВАЯ ПАУЗА
  c = 600;                                     // СКОРОСТЬ2 ШАГОВАЯ
  d = 200;                                     // СКОРОСТЬ2 КОЛИЧЕСТВО ШАГОВ
  e = 1;                                       // СКОРОСТЬ3

  rval = digitalRead(rightPin1);               // Переменные горизонтального ДШИ1
  lval = digitalRead(leftPin1);
  rightStop = digitalRead(Stop1);
  leftStop = digitalRead(Stop2);

  uval = digitalRead(upPin2);                  // Переменные вертикального ДШИ2
  dval = digitalRead(downPin2);
  upStop = digitalRead(Stop3);
  downStop = digitalRead(Stop4);

  spPin1 = digitalRead(speedPin1);             // Переменная скорости1 
  spPin2 = digitalRead(speedPin2);             // Переменная скорости2
  dat = digitalRead(datch);                    // Переменная датчика касания
  sto = digitalRead(stol);                     // Переменная кнопки подъема столика
  sstate = digitalRead(magn);                  // Переменная состояния магнита столика

  sb = digitalRead(signbrak2);                 // Переменная сигнала брака по току

  digitalWrite(datch, HIGH);                   // Запуск обратной логики касания
  digitalWrite(signbrak1, HIGH);               // Питание на pin1 сигнала брака

  direct[0] = '\n';
  st[0] = '\n';
  sp[0] = '\n';

  if (sto == HIGH) 
  {
    if (sstate == LOW)
    {
      digitalWrite(magn, HIGH);
      delay(400);
    }
    if (sstate == HIGH) 
    {    
      digitalWrite(magn, LOW);
      delay(400);
    }
  }


  if (dat == HIGH) 
  {    
    digitalWrite(diod, HIGH);
  }
  else 
  {    
    digitalWrite(diod, LOW);
  }


  ////ДШИ1/////////////////////////////////////////////

  // right SPEED 1.
  if (rval == HIGH && spPin1 == LOW && spPin2 == LOW && rightStop == LOW) 
  {  
    digitalWrite(magn, LOW);
    digitalWrite(dirpin1, LOW);                // Выбираем направление
    digitalWrite(steppin1, LOW);
    digitalWrite(steppin1, HIGH);
    delay(a); 
  }


  // left SPEED 1.
  if (lval == HIGH && spPin1 == LOW && spPin2 == LOW && leftStop == LOW)
  {    
    digitalWrite(magn, LOW);
    digitalWrite(dirpin1, HIGH);               // Меняем направление
    digitalWrite(steppin1, LOW);
    digitalWrite(steppin1, HIGH);
    delay(a); 
  }


  // right SPEED 2.
  if (rval == HIGH && spPin1 == HIGH && spPin2 == LOW && rightStop == LOW) 
  { 
    digitalWrite(magn, LOW);
    for (i=0; i<d; i++)
    {    
      digitalWrite(dirpin1, LOW);              // Выбираем направление
      digitalWrite(steppin1, LOW);
      digitalWrite(steppin1, HIGH);
      delayMicroseconds(c); 
    }
    delay(b);
  }


  // left SPEED 2.
  if (lval == HIGH && spPin1 == HIGH && spPin2 == LOW && leftStop == LOW)
  {    
    digitalWrite(magn, LOW);
    for (i=0; i<d; i++)
    {    
      digitalWrite(dirpin1, HIGH);             // Выбираем направление
      digitalWrite(steppin1, LOW);
      digitalWrite(steppin1, HIGH);
      delayMicroseconds(c);
    }
    delay(b);
  }


  // right SPEED 3.
  if (rval == HIGH && spPin1 == LOW && spPin2 == HIGH && rightStop == LOW) 
  {  
    digitalWrite(magn, LOW);
    digitalWrite(dirpin1, LOW);                // Выбираем направление
    digitalWrite(steppin1, LOW);
    digitalWrite(steppin1, HIGH);
    delayMicroseconds(e);
  }


  // left SPEED 3.
  if (lval == HIGH && spPin1 == LOW && spPin2 == HIGH && leftStop == LOW)
  {        
    digitalWrite(magn, LOW);
    digitalWrite(dirpin1, HIGH);               // Меняем направление
    digitalWrite(steppin1, LOW);
    digitalWrite(steppin1, HIGH);
    delayMicroseconds(e);
  }




  ////ДШИ 2/////////////////////////////////////////

  // up SPEED 1.  
  if (uval == HIGH && spPin1 == LOW && spPin2 == LOW && upStop == LOW) 
  {    
    digitalWrite(magn, LOW);
    digitalWrite(dirpin2, LOW);                // Выбираем направление
    digitalWrite(steppin2, LOW);
    digitalWrite(steppin2, HIGH);
    delay(a); 
  }


  // down SPEED 1.
  if (dval == HIGH && spPin1 == LOW && spPin2 == LOW && downStop == LOW)
  {    
    digitalWrite(magn, LOW);
    digitalWrite(dirpin2, HIGH);               // Меняем направление
    digitalWrite(steppin2, LOW);
    digitalWrite(steppin2, HIGH);
    delay(a); 
  }


  // up SPEED 2.
  if (uval == HIGH && spPin1 == HIGH && spPin2 == LOW && upStop == LOW) 
  {       
    digitalWrite(magn, LOW);
    for (i=0; i<d; i++)
    {    
      digitalWrite(dirpin2, LOW);              // Выбираем направление
      digitalWrite(steppin2, LOW);
      digitalWrite(steppin2, HIGH);
      delayMicroseconds(c);
    }
    delay(b);
  }


  // down SPEED 2.
  if (dval == HIGH && spPin1 == HIGH && spPin2 == LOW && downStop == LOW)
  {    
    digitalWrite(magn, LOW);
    for (i=0; i<d; i++)
    {    
      digitalWrite(dirpin2, HIGH);             // Выбираем направление
      digitalWrite(steppin2, LOW);
      digitalWrite(steppin2, HIGH);
      delayMicroseconds(c);      
    }
    delay(b);
  }


  // up SPEED 3.
  if (uval == HIGH && spPin1 == LOW && spPin2 == HIGH && upStop == LOW) 
  {       
    digitalWrite(magn, LOW);
    digitalWrite(dirpin2, LOW);                // Выбираем направление
    digitalWrite(steppin2, LOW);
    digitalWrite(steppin2, HIGH);
    delayMicroseconds(e);
  }


  // down SPEED 3.
  if (dval == HIGH && spPin1 == LOW && spPin2 == HIGH && downStop == LOW)
  {
    digitalWrite(magn, LOW);
    digitalWrite(dirpin2, HIGH);               // Меняем направление
    digitalWrite(steppin2, LOW);
    digitalWrite(steppin2, HIGH);
    delayMicroseconds(e);
  }





  while(Serial.available() > 0)                // Загоняем прочитанное в буфер
  {       
    buffer[k] = Serial.read();
    k++;
    delay(5);
  }
  buffer[k++] = '\n';                          // Закрываем массив

  if(k>0)                                      // Если буфер наполнен
  {       
    sscanf(buffer, "%s,%d,%d", &direct, &st, &sp);      // Разбираем его на части отделенные запятой 
  }

  S = String(st).toInt();
  V = String(sp).toInt();
/*
  //ПОДЪЕМ СТОЛИКА
  if ((String)direct == "m")
  {    
    digitalWrite(magn, HIGH);
  }
*/
  // БЛОК РЕЛЕ
  if ((String)direct == "rh")
  {    
    digitalWrite(rele, HIGH);
  }
  if ((String)direct == "rl")
  {    
    digitalWrite(rele, LOW);
  }

  // ПРОВЕРКА КАСАНИЯ
  if ((String)direct == "a")
  {    

    // ДАТЧИК КАСАНИЯ.
    if (dat == HIGH)                           // Контакт
    {
      Serial.println(1, DEC);  
      delay(100);    
    }
    else                                       // Нет контакта
    {
      Serial.println(2, DEC);
      delay(100);      
    }   
  }

  // ПРОВЕРКА ГОДНОСТИ ПО ТОКУ
  if ((String)direct == "sb")
  {    

    // СИГНАЛ БРАКА.
    if (sb == HIGH)                            // Брак
    {
      Serial.println(3, DEC);     
      delay(100); 
    }
    else                                       // Годный
    {
      Serial.println(4, DEC); 
      delay(100);     
    }   
  }

  // Маркировка бракованного диода1
  if ((String)direct == "b1")
  {    
    digitalWrite(brak1, HIGH);
    delay(100);
    digitalWrite(brak1, LOW);
  }

  // Маркировка бракованного диода2
  if ((String)direct == "b2")
  {    
    digitalWrite(brak2, HIGH);
    delay(100);
    digitalWrite(brak2, LOW);
  }

  // Крутим вправо (RIGHT)/////////////////////
  if ((String)direct == "r" && rightStop == LOW)
  {
    digitalWrite(magn, LOW);
    for (i=0; i<S; i++)
    {
      digitalWrite(dirpin1, LOW);              // Выбираем направление
      digitalWrite(steppin1, LOW);
      digitalWrite(steppin1, HIGH);
      delay(V); 
    }
    digitalWrite(magn, HIGH);
  }

  // Крутим влево (LEFT)///////////////////////
  if ((String)direct == "l" && leftStop == LOW)
  {
    digitalWrite(magn, LOW);
    for (i=0; i<S; i++)
    {
      digitalWrite(dirpin1, HIGH);             // Выбираем направление
      digitalWrite(steppin1, LOW);
      digitalWrite(steppin1, HIGH);
      delay(V); 
    }
    digitalWrite(magn, HIGH);
  }

  // Крутим вверх (UP)/////////////////////////
  if ((String)direct == "u" && upStop == LOW) 
  {
    digitalWrite(magn, LOW);
    for (i=0; i<S; i++)
    {    
      digitalWrite(dirpin2, LOW);              // Выбираем направление
      digitalWrite(steppin2, LOW);
      digitalWrite(steppin2, HIGH);
      delay(V); 
    }
    digitalWrite(magn, HIGH);
  }

  // Крутим вниз (DOWN)////////////////////////
  if ((String)direct == "d" && downStop == LOW) 
  {
    digitalWrite(magn, LOW);
    for (i=0; i<S; i++)
    {    
      digitalWrite(dirpin2, HIGH);             // Выбираем направление
      digitalWrite(steppin2, LOW);
      digitalWrite(steppin2, HIGH);
      delay(V); 
    }
    digitalWrite(magn, HIGH);
  }   
}

 

roccosiffredi
Offline
Зарегистрирован: 22.06.2012

 

Программа написана для автоматизации измерений диодов на советском зонде. Автоматизация производится с помощью гррафической среды LabVIEW. Проблема в следующем:

Сериал монитор при отправке команды "a,200,2" не отвечает. Ответ придет только если монитор повисит секунд 10 после включения. Это нормальная практика?

На стороне LabVIEW та же ситуация: программа начинает работать спустя 10 секунд.

С уважением, Александр.

leshak
Offline
Зарегистрирован: 29.09.2011

Не вникая, просто бросилось в глаза

 buffer[k++] = '\n';                          // Закрываем массив

В C, признаком конца строки является символ с кодом ноль, а не перевод строки, поэтому

 buffer[k++] =0;                          // Закрываем массив