Arduino 仅读取串行数据一次

Arduino 仅读取串行数据一次,arduino,Arduino,我有以下代码,但通电时只能传输一次m1。之后,我的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

我有以下代码,但通电时只能传输一次m1。之后,我的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");
    }
}
#包括
加速步进器(1,3,2);
char inData[20];//为字符串分配一些空间
字符英寸=-1;//在何处存储读取的字符
字节索引=0;//索引到数组中;在哪里存储字符
无效设置()
{
步进电机设置最大速度(1000.0);
步进电机。设定加速度(1000);
步进电机。设置电流位置(0);
Serial.begin(9600);//在9600开始串行通信。
串行写入(“通电”);
}
char Comp(char*This){
while(Serial.available()>0)//除非
//你知道有数据
{
if(index<19)//比数组的大小小一个
{
inChar=Serial.read();//读取字符
inData[index]=inChar;//存储它
index++;//递增下一步写入的位置
inData[index]='\0';//Null终止字符串
}
}
if(strcmp(inData,This)==0){

对于(int i=0;i而言,您的代码似乎基于(错误的)假设,即一旦读取第一个字符,发送字符串将完全可用。因此,当您开始解析时,您可能收到“m1”,但尚未收到“on”。这反过来确保字符串比较总是失败,并且代码似乎被卡住

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

顺便说一句:最简单的修复方法是不使用字符串,而是使用字符。另一个简单的修复方法是,还有其他类似的库


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

您的代码似乎停留在(错误的)状态机上假设在读取第一个字符后发送字符串将完全可用。因此,在开始解析时,您可能收到“m1”,但尚未收到“on”。这反过来确保字符串比较始终失败,并且代码似乎被卡住

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

顺便说一句:最简单的修复方法是不使用字符串,而是使用字符。另一个简单的修复方法是,还有其他类似的库


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

串行输出是什么?输入
m1 on
m1 off
将产生适当的
>马达1->Online\n
马达1->Offline\n
响应,但这只能执行一次。然后您将陷入无限循环中。在两次迭代后强制您的while循环中断以验证这一点。您的串行输出是什么?输入
m1 on
m1 off
将生成相应的
Motor 1->Online\n
Motor 1->Offline\n
响应,但这只能执行一次。然后您将陷入无限循环中。在两次迭代后强制您的while循环中断以验证这一点。