这是大局:
我试图通过记录一组位置然后再回放来控制步进电机。为了控制步进器,我正在使用AccelStepper。
由于移动数据很大,我需要将它存储在我的Mac上并使用串行连接将其发送到Arduino。
另外,由于AccelStepper的工作方式,我无法承受延误。
问题在于:
当我插入大约60ms或更长的延迟时,下面的代码有效。但是,这搞砸了AccelStepper。
我对此的理解是第一个while循环"听"到串行线。如果没有什么可读的,我会发送一个' A'到Mac请求一些数据。当有数据可供阅读时,此循环中断。
第二个循环读取串行行,直到遇到换行符。此代码适用于延迟,并且没有延迟。
这有意义吗? 感谢信。
================================
if (stepper.distanceToGo() == 0)
{
while (Serial.available() <= 0) { // Ask Mac for more data.
Serial.print("A");
delay(60); // Argh line!
stepper.runSpeedToPosition();
}
while(Serial.available() > 0) { // There's info on the serial line
character = Serial.read();
content.concat(character);
if (character == '\n') break; // Keep reading until newline
stepper.runSpeedToPosition();
}
答案 0 :(得分:0)
没有延迟,while循环将占用系统(CPU)资源的“全部”,实际上是从串行线延迟中断。 60虽然是非常具体的价值。
所以一个选项是重写循环并测试这是否有帮助:
if (stepper.distanceToGo() == 0) {
while (true) {
if(Serial.available() <= 0) { // Ask Mac for more data.
Serial.print("A");
stepper.runSpeedToPosition();
} else {
// the case for (Serial.available() > 0) There's info on the serial line
character = Serial.read();
content.concat(character);
if (character == '\n') break; // Keep reading until newline
stepper.runSpeedToPosition();
}
}
}