![](/img/trans.png)
[英]python 3 readline() twice from arduino Serial Monitor
[英]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.