使用PySerial与Arduino Uno的时序问题

时间:2015-06-28 02:56:14

标签: arduino pyserial

这是大局:

我试图通过记录一组位置然后再回放来控制步进电机。为了控制步进器,我正在使用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(); 
 }  

1 个答案:

答案 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(); 
        }
    }
}