我正在尝试从与 Arduino 接口(interface)的传感器发布 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

最佳答案

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

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

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

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

关于python - Python 串行读取线是否会中断 Arduino 循环?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12354003/

10-12 22:47
查看更多