我有以下代码,但只能在开机时传输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 :(得分:1)
您的代码似乎依赖于(错误的)假设,即在读取第一个字符后,发送字符串将完全可用。所以,当你开始解析时,也许你收到了“m1”但还没有“开启”。这反过来确保您的字符串比较将始终失败,并且您的代码似乎卡住了。
我建议你在合适的地方添加Serial.print语句,看看你的代码实际收到了什么以及它是如何处理的。一旦你有足够的印刷品,你将更好地了解正在发生的事情,并能够自己解决这个问题。
BTW:最简单的解决方法是不使用字符串作为简单命令,而是使用字符。另一个简单的解决方法是give the parsing work to a suitable library.还有其他类似的库。
另一种解决方案是使用有限状态机解析串行接口,就像我为this experiment.实现它一样。这很可能是保持ram /资源消耗低但开发时间昂贵的最佳解决方案。