2013-05-16 4 views
1

У меня есть следующий код, но он может передавать только m1 on один раз при включении питания. После этого мой arduino игнорирует серийные данные, которые я отправляю им.Только чтение последовательных данных один раз

Благодарим за помощь.

#include <AccelStepper.h> 

AccelStepper stepper(1, 3, 2); 

char inData[20]; // Allocate some space for the string 
char inChar=-1; // Where to store the character read 
byte index = 0; // Index into array; where to store the character 

void setup() 
{ 
    stepper.setMaxSpeed(1000.0); 
    stepper.setAcceleration(1000); 
    stepper.setCurrentPosition(0); 
    Serial.begin(9600); // Begin serial communiation at 9600. 
    Serial.write("Power On"); 
} 
char Comp(char* This) { 
    while (Serial.available() > 0) // Don't read unless 
            // there you know there is data 
    { 
     if(index < 19) // One less than the size of the array 
     { 
      inChar = Serial.read(); // Read a character 
      inData[index] = inChar; // Store it 
      index++; // Increment where to write next 
      inData[index] = '\0'; // Null terminate the string 
     } 
    } 

    if (strcmp(inData,This) == 0) { 
     for (int i=0;i<19;i++) { 
      inData[i]=0; 
     } 
     index=0; 
     return(0); 
    } 
    else { 
     return(1); 
    } 
} 

void loop() 
{ 
    if (Comp("m1 on")==0) { 
     Serial.write("Motor 1 -> Online\n"); 
    } 
    if (Comp("m1 off")==0) { 
     Serial.write("Motor 1 -> Offline\n"); 
    } 
} 
+0

Какой у вас серийный выход? –

+0

, вводящий 'm1 on' или' m1 off', выдаст соответствующий ответ 'Motor 1 -> Online \ n' или' Motor 1 -> Offline \ n', но это может быть выполнено только один раз. – mh00h

+0

Затем вы застреваете в бесконечном цикле. Принудительный цикл while прерывается после нескольких итераций, чтобы проверить это. –

ответ

1

Ваш код, кажется, почивать на (неправильном) предположении, что строка посыла будет полностью доступен, как только первый символ читается. Так что, возможно, вы получили «m1», но еще не «на», когда вы начинаете синтаксический анализ. Это, в свою очередь, гарантирует, что сравнение строк всегда будет терпеть неудачу, и ваш код, похоже, застрял.

Предлагаю вам добавить заявления Serial.print в подходящие места, чтобы узнать, что ваш код действительно получил и как он его обработал. Когда у вас будет достаточно отпечатков, вы лучше поймете, что происходит, и сможете исправить это самостоятельно.

BTW: самое простое исправить - не использовать строки для простых команд, а вместо символов. Еще одно простое решение - give the parsing work to a suitable library. Существуют и другие подобные библиотеки.

Другим решением является разбор последовательного интерфейса с конечным автоматом, как я его реализовал для this experiment. Это, скорее всего, лучшее решение для поддержания низкого потребления ресурсов/ресурсов с точки зрения времени разработки.

Смежные вопросы