我编写了用串口控制步进电机的短测试代码(使用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;
}
}发布于 2017-03-20 10:21:29
阅读accelstepper并遵循runtoPosition的提示:
Dont use this in event loops, since it blocks. 相反,请看一看run():
保持循环()快速,每次只调用run()。
https://stackoverflow.com/questions/42888495
复制相似问题