Arduino 仅读取串行数据一次
我有以下代码,但通电时只能传输一次m1。之后,我的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
#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循环中断以验证这一点。