繁体   English   中英

Python串行读取线是否中断了Arduino循环?

[英]Does Python serial readline interupt Arduino loop?

我试图从与Arduino接口的传感器发布Twitter更新。 Adruino环路在读取传感器电压之间有1秒的延迟。 Python代码在Twitter更新之间有1小时的延迟。

似乎Python脚本实际上会中断 Arduino循环,直到它在串行端口上读取新行。 它是否正确?

例如,尽管Arduino程序在循环上运行1小时,它只会显示millis()计数器值为millis()小时后它将显示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

如果输出缓冲区已满, Serial.write (以及任何依赖它的函数,如Serial.print )将阻塞。 如果另一端(即您的Python脚本或串行监视器)从端口读取,则只能输出缓冲区。

串行监视器不断读取串行端口输出,因此缓冲区不会填满。 但是,由于您的Python脚本每小时只读取一行输出,因此缓冲区持续满。 由于串行端口缓冲,每隔一小时,你读输出的下一秒

这里发生的是你的Arduino代码运行,比方说,10个循环,并在缓冲区填充之前写入10行。 您的Python代码将读取10行,每小时一次。 10个小时后,Arduino放入缓冲区的新行将具有不同的时间戳。

然后,解决方案是从Arduino发送每小时更新(在Python中使用arduino.readline块一小时)或者从Python中不断地(每秒)读取更新并每小时触发一次Twitter更新(例如,使用两个线程,一个读取和更新温度,另一个使用最新的本地数据每小时发布更新。

我会使用像twisted这样的东西,它具有非阻塞机制,可以通过串口接收数据。 (Twisted有一个事件循环)当收到数据时,会调用一个已注册的处理程序,因此您将无法获得完整的缓冲区以及您遇到的阻塞行为。

我用它来接收/发送数据到arduino和feed cosm。

您可以在此处查看示例http://twistedmatrix.com/documents/current/core/examples/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM