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");
    }
}
4

1 回答 1

1

您的代码似乎基于(错误的)假设,即一旦读取第一个字符,发送字符串将完全可用。所以当你开始解析时,也许你收到了“m1”但还没有“on”。这反过来又确保您的字符串比较总是会失败,并且您的代码似乎被卡住了。

我建议您在合适的地方添加 Serial.print 语句,以查看您的代码实际收到的内容以及它是如何处理的。一旦您有足够的打印件,您将更好地了解正在发生的事情并能够自行解决此问题。

顺便说一句:最简单的解决方法是不要将字符串用于简单命令,而是使用字符。另一个简单的解决方法是将解析工作交给合适的库。还有其他类似的库。

另一种解决方案是使用有限状态机解析串行接口,就像我为本实验实现的那样。这很可能是保持 ram / 资源消耗低但在开发时间方面昂贵的最佳解决方案。

于 2013-05-20T07:49:20.920 回答