簡體   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