使用 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 的时序问题的主要内容,如果未能解决你的问题,请参考以下文章
PySerial + Arduino MEGA 1 秒延迟/响应时间
无法使用pyserial在arduino和python之间进行通信