1

次のコードがありますがm1 on 、電源投入時に 1 回しか送信できません。その後、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");
    }
}
4

1 に答える 1

1

あなたのコードは、最初の文字が読み取られるとすぐに送信文字列が完全に利用可能になるという(間違った)仮定に基づいているようです。したがって、解析を開始したときに "m1" を受け取ったが、まだ "on" を受け取っていない可能性があります。これにより、文字列比較が常に失敗し、コードがスタックしているように見えます。

Serial.print ステートメントを適切な場所に追加して、コードが実際に受け取ったものとそれをどのように処理したかを確認することをお勧めします。十分な数の印刷物を配置したら、何が起こっているのかをよりよく理解し、自分でこれを修正できるようになります.

ところで: 最も簡単な修正方法は、単純なコマンドに文字列を使用するのではなく、代わりに文字を使用することです。もう 1 つの簡単な修正方法は、解析作業を適切なライブラリに任せることです。他にも同様のライブラリがあります。

もう 1 つの解決策は、この実験で実装したように、シリアル インターフェイスを有限ステート マシンで解析することです。これはおそらく、RAM/リソースの消費を低く抑えるための最良のソリューションですが、開発時間の点では高価です。

于 2013-05-20T07:49:20.920 に答える