这是一个用于沿着小车移动相机的游戏中时光倒流脚本。问题在于,当我运行代码时,有时(例如,在迭代7中),小车正在移动并且相机同时拍摄照片。就好像命令在下一个命令执行之前没有阻塞。正如你所看到的,我已经尝试在代码中散布睡眠无效。
以下是工作流程:
这是我的Python脚本。
import os, commands, string, gps
from subprocess import Popen, PIPE
from time import sleep
import serial
ser = serial.Serial('/dev/ttyACM0', 9600)
sleep (5)
for i in range(0, 20):
#To write information
steps = 1000*(i+1)
ser.write('1,'+str( steps )+'/n')
sleep (4)
bashCommand = "sudo /home/mh00h/Timelapse/camerareset.sh"
os.system(bashCommand)
sleep (2)
bashCommand = "sudo gphoto2 --capture-image"
os.system(bashCommand)
sleep (1)
答案 0 :(得分:3)
(可能)有两个原因可以解释为什么不按要求阻止:
Serial.write()
的数据长度小于缓冲区,该调用就可以在Arduino草图读取数据之前返回。实际上,根据数据的长度和缓冲区的大小,在Arduino完成任何读取之前,可以完成对Serial.write()
的多次调用。在通话之间休息可能会有所帮助,但即使你能让它发挥作用,你也可能会遇到奇怪的,不可重复的行为。
上述两个问题的解决方案是同步代码中的操作。对于串行通信,这可以通过从Arduino草图将“已完成”消息发送回python脚本来实现,该脚本将从串行端口读取,直到它收到此消息。如何将步进电机与Arduino草图(如果需要)同步将取决于Arduino到步进电机通信的编码方式。