如何中止函数RunToPosition-AccelStepper/Arduino

如何中止函数RunToPosition-AccelStepper/Arduino,arduino,Arduino,我已经准备了简短的测试代码,通过串口控制步进电机(使用AccelStepper库)。代码使用三个命令M-将电机移动到定义位置,H-中止操作,P-检查当前电机步进位置。每个赞扬都必须以“#”结尾。所以当我写M500时,意味着电机将开始移动,直到达到位置500我的问题是如何中止此操作???串行端口被阻止,直到RunToPosiotion函数完成 #include <AccelStepper.h> #include <MultiStepper.h> AccelStepper

我已经准备了简短的测试代码,通过串口控制步进电机(使用AccelStepper库)。代码使用三个命令M-将电机移动到定义位置,H-中止操作,P-检查当前电机步进位置。每个赞扬都必须以“#”结尾。所以当我写M500时,意味着电机将开始移动,直到达到位置500我的问题是如何中止此操作???串行端口被阻止,直到RunToPosiotion函数完成

#include <AccelStepper.h>
#include <MultiStepper.h>

AccelStepper stepper = AccelStepper(AccelStepper::HALF4WIRE, 4, 5, 6, 7);
String MyString;
String Command;
int Value;


void setup() {
  Serial.begin(57600);
  stepper.setMaxSpeed(400);
  stepper.setAcceleration(600);
  stepper.setCurrentPosition(100);
  }

void serialEvent() {
    while (Serial.available()) {
        char inChar = (char)Serial.read();
        if (inChar == '#') {
            SerialCommand(MyString);
            MyString = "";
        }
        else {
            MyString += inChar;
        }
    }
}

void loop() {
    }

void SerialCommand(String ASCOM_Command) {
    Command = String(ASCOM_Command.charAt(0));
    String Txt_Value = ASCOM_Command.substring(1);
    Value = Txt_Value.toInt();

    /*Commands, an example: M500# - start motor to move until get  500 position 
    P - check actual focuser position
    M - Move to specific position called by client application
    H - Halt / Abort
    */
    switch (ASCOM_Command.charAt(0))    {

    case 'P':
        Serial.println(stepper.currentPosition()); 
        break;

    case 'M':
        stepper.moveTo(Value);
        stepper.runToPosition();
        break;
    case 'H':
        stepper.stop();
        Serial.println("H#");
        break;
    }
}
#包括
#包括
AccelStepper stepper=AccelStepper(AccelStepper::HALF4WIRE,4,5,6,7);
字符串MyString;
字符串命令;
int值;
无效设置(){
序列号。开始(57600);
步进电机。设定最大速度(400);
步进电机设定加速度(600);
步进电机设置电流位置(100);
}
void serialEvent(){
while(Serial.available()){
char inChar=(char)Serial.read();
如果(英寸='#'){
SerialCommand(MyString);
MyString=“”;
}
否则{
MyString+=英寸;
}
}
}
void循环(){
}
void SerialCommand(字符串ASCOM_命令){
Command=String(ASCOM_Command.charAt(0));
字符串Txt_值=ASCOM_命令。子字符串(1);
Value=Txt_Value.toInt();
/*命令,例如:M500#-启动电机移动,直到达到500位置
P-检查实际聚焦位置
M-移动到客户端应用程序调用的特定位置
H-停止/中止
*/
开关(ASCOM_命令字符(0)){
案例“P”:
Serial.println(stepper.currentPosition());
打破
案例“M”:
步进器。移动到(值);
步进器。运行位置();
打破
案例“H”:
步进器。停止();
Serial.println(“H#”);
打破
}
}

阅读accelstepper文档并按照runtoPosition提示操作:

    Dont use this in event loops, since it blocks. 
请查看
run()

保持loop()快速,每次只需调用run()