我正在尝试从与Arduino接口的传感器发布Twitter更新。 Adruino环路在读取传感器电压之间有1秒的延迟。 Python代码在Twitter更新之间有1小时的延迟。
似乎Python脚本实际上中断了 Arduino循环,直到它在串行端口上读取新行。它是否正确?
例如,尽管Arduino程序在循环上运行了1小时,但它只显示millis()
计数器值为1001,2小时后它将显示2002.没有运行Python脚本并观察序列仅监视,Arduino代码按预期计算毫秒数。
这通常不会成为问题,但是如果您想要同时运行数据记录器,millis()
以高采集率连续运行,那将是一个问题。由于串行监视器不能与Python程序共享同一个端口,所以很难知道发生了什么。
以下是Arduino代码的示例
void loop() {
unsigned long ms=millis();
// read the input on analog pin 1:
int sensorValue = analogRead(A1);
float Temp = sensorValue * Vref * (100.0/1023.0);
// print out the value you read:
Serial.print(Temp);
Serial.print(" degC");
Serial.print(" , ");
Serial.print(ms);
Serial.println(" milliseconds");
delay(1000); // delay in miliseconds between reads for stability
}
以下是相关Python代码的部分:
arduino = serial.Serial('COM6', 9600)
while 1: ##Infinite Loop
status = arduino.readline() ##Wait for new line to come across Serial
api.PostUpdate(status) ##Post message to Twitter
time.sleep(3600) ##Wait 3600 seconds
答案 0 :(得分:6)
Serial.write
(以及任何依赖它的函数,如Serial.print
)将在输出缓冲区已满时阻塞。只有当另一端(即您的Python脚本或串行监视器)从端口读取时,输出缓冲区才能耗尽。
串行监视器不断读取串行端口输出,因此缓冲区不会填满。但是,由于您的Python脚本每小时仅读取一行输出 ,因此缓冲区将持续保持满。因为串口是缓冲的,所以每小时都会读取输出的下一个第二个。
这里发生的是你的Arduino代码运行,例如10个循环,并在其缓冲区填充之前写入10行。您的Python代码将读取10行,每小时一次。 10个小时后,Arduino放入缓冲区的新行将有不同的时间戳。
然后,解决方案是从Arduino发送每小时更新(在Python中放置arduino.readline
块一小时)或者从Python中不断(每秒)读取更新并每小时触发一次Twitter更新(例如使用两个线程,一个用于读取和更新温度,另一个用于使用最新的本地数据每小时发布更新。
答案 1 :(得分:1)
我会使用像twisted这样的东西,它具有非阻塞机制,可以通过串口接收数据。 (Twisted有一个事件循环)当收到数据时,会调用一个已注册的处理程序,所以 你不会得到完整的缓冲区和你遇到的阻止行为。
我用它来接收/发送数据到arduino和feed cosm。
您可以在此处查看示例http://twistedmatrix.com/documents/current/core/examples/