Arduino Mega обмен данными ожидание serial monitor
- Войдите на сайт для отправки комментариев
Пнд, 04/03/2013 - 15:58
//ДШИ 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);
}
}
Программа написана для автоматизации измерений диодов на советском зонде. Автоматизация производится с помощью гррафической среды LabVIEW. Проблема в следующем:
Сериал монитор при отправке команды "a,200,2" не отвечает. Ответ придет только если монитор повисит секунд 10 после включения. Это нормальная практика?
На стороне LabVIEW та же ситуация: программа начинает работать спустя 10 секунд.
С уважением, Александр.
Не вникая, просто бросилось в глаза
В C, признаком конца строки является символ с кодом ноль, а не перевод строки, поэтому