4

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
}

そして、これが問題の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
4

2 に答える 2

1

シリアルポートを介してデータを受信するための非ブロッキングメカニズムを備えたtwistedのようなものを使用します。(Twistedにはイベントループがあります)データが受信されると、登録されたハンドラーが呼び出されるため、バッファーがいっぱいになったり、ブロック動作が発生したりすることはありません。

私はそれを使って、arduinoとの間でデータを送受信し、cosmにフィードします。

ここで例を見ることができますhttp://twistedmatrix.com/documents/current/core/examples/

于 2012-09-10T15:10:40.890 に答える