使用 PySerial 和 Arduino Uno 的时序问题

Posted

技术标签:

【中文标题】使用 PySerial 和 Arduino Uno 的时序问题【英文标题】:Timing Issue Using PySerial with Arduino Uno 【发布时间】:2015-06-28 02:56:13 【问题描述】:

这是大图:

我试图通过记录一组位置然后回放它们来控制步进电机。为了控制步进器,我使用的是 AccelStepper。

由于运动数据很大,我需要将其存储在我的 Mac 上并使用串行连接将其发送到 Arduino。

此外,由于 AccelStepper 的工作方式,我无法承受延误。

问题来了:

当我插入大约 60 毫秒或更长时间的延迟时,下面的代码可以工作。然而,这搞砸了 AccelStepper。

我对此的理解是,第一个 while 循环“监听”串行线路。如果没有什么要读的,我会向 Mac 发送一个“A”来请求一些数据。当有数据可供读取时,此循环中断。

第二个循环读取串行行,直到遇到换行符。这段代码有延迟,也有延迟。

这有意义吗? 谢谢。

=================================

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】:

没有延迟,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(); 
        
    
  

【讨论】:

感谢您考虑这个问题。不幸的是,我仍然需要 Serial.print("A"); 之后的延迟;使其始终如一地工作。

以上是关于使用 PySerial 和 Arduino Uno 的时序问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Arduino 和 PySerial 回显一系列字节

PySerial + Arduino MEGA 1 秒延迟/响应时间

arduino 使用 pySerial 打开/关闭 LED

无法使用pyserial在arduino和python之间进行通信

arduino leonardo r3 和 arduino uno r3 有啥区别

重新打开后,arduino 和 pyserial 之间的串行连接变慢