are*_*eid 4 python arduino delay
我试图从与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
}
Run Code Online (Sandbox Code Playgroud)
这是有问题的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
Run Code Online (Sandbox Code Playgroud)
Serial.write(以及依赖于它的任何函数,Serial.print如果输出缓冲区已满,将阻塞).如果另一端(即您的Python脚本或串行监视器)从端口读取,则只能输出缓冲区.
串行监视器不断读取串行端口输出,因此缓冲区不会填满.但是,由于您的Python脚本每小时只读取一行输出,因此缓冲区持续满.由于串行端口缓冲,每隔一小时,你看接下来的第二输出.
这里发生的是你的Arduino代码运行,比方说,10个循环,并在缓冲区填充之前写入10行.您的Python代码将读取10行,每小时一次.10个小时后,Arduino放入缓冲区的新行将具有不同的时间戳.
然后,解决方案是从Arduino发送每小时更新(arduino.readline在Python中放置一小时)或者从Python中不断地(每秒)读取更新并每小时触发一次Twitter更新(例如,使用两个线程,一个读取和更新温度,另一个使用最新的本地数据每小时发布更新.
| 归档时间: |
|
| 查看次数: |
2030 次 |
| 最近记录: |