1

私はArduinoを使用しており、シールドとセンサーから値を取得しています。また、ポート 9600 をリッスンしているため、それらの一部を serial.println に送信します。ポート 9600 をリッスンしており、これらの値を txt に保存しています。その後、これらの値をデータベースにアップロードし、Web サービスを使用します。

しかし、指定された時間内に 9600 ポートを保存できませんでした。私がpythonアプリケーションを閉じなかった場合、決して閉じず、txtファイルを保存しないためです。

私のコードは以下です。1分ごとにtxtを保存したい。

どうすればいいですか?

import serial
ser = serial.Serial('/dev/tty.usbmodem1411', 9600, timeout=1)
while 1:
    line = ser.readline()   # read a '\n' terminated line
    line2=line.decode("utf-8")
    ths = open("/Users/macproretina//Desktop/data.txt", "a")
    ths.write(line2)
ser.close()
4

1 に答える 1

1

単純なタイマーを使用してループを停止できます。リソース管理を少しクリーンアップしました。コンテキスト マネージャーは非常に便利です。

import threading
from contextlib import closing
import serial

continue_looping = True
def stopper():
    global continue_looping
    continue_looping = False

timer = threading.Timer(60, stopper)
timer.start()

with open("/Users/macproretina/Desktop/data.txt", 'w') as out_file:
    with closing(serial.Serial('/dev/tty.usbmodem1411', 9600, timeout=1)) as ser:
        while continue_looping:
            line = ser.readline()   # read a '\n' terminated line
            out_file.write(line.decode('utf-8')
            out_file.flush()

シリアルタイムアウトにより、少しずれている可能性があります。必要な場合に呼び出すと、出力がファイルに書き込まれることに注意してくださいf.flush()

于 2013-05-16T20:38:31.703 に答える