Amine Harbaoui
Amine Harbaoui

Reputation: 1295

run code every X seconds

I Have infinite loop that read bytes from serial port, I want to save the read data to firebase database every X seconds.

I used this code snippet but it's not helping:

import threading

def printit():
  threading.Timer(5.0, printit).start()
  print "Hello, World!"

printit()

This is my code

import serial

ser = serial.Serial()
ser.baudrate = 115200
ser.port = "/dev/ttyUSB0"
ser.timeout = 30
try:
    try:
        while 1:
            line = ser.readline().rstrip().decode('utf-8')

            # print("save data here every X seconds)
    except KeyboardInterrupt:
        ser.close()  # Close port
        pass
except serial.serialutil.SerialException as e:
    print(str(e))

I can't use sleep because it blocking the main thread,So how to let the code read continuously and print "data saved" every X seconds (I'll save to database in my case)

Upvotes: 0

Views: 1760

Answers (2)

Amine Harbaoui
Amine Harbaoui

Reputation: 1295

Thanks to Lutz Horn for the suggestion in the comment, I resolve the problem like that :

import schedule
import time
import serial

ser = serial.Serial()
ser.baudrate = 115200
ser.port = "/dev/ttyUSB0"
ser.timeout = 30

schedule.every(10).seconds.do(save_db)
try:
    try:
        while 1:
            schedule.run_pending()
            line = ser.readline().rstrip().decode('utf-8')
            # here every 10 seconds the function save_db will be called 
    except KeyboardInterrupt:
        ser.close()  # Close port
        pass
except serial.serialutil.SerialException as e:
    print(str(e))

Upvotes: 1

Alexej Luft
Alexej Luft

Reputation: 21

I hope i have understood you correctly. Use time.time() to set timer.

import time

def doEvery_X_Seconds():
        print("I do it every X seconds")
        time.sleep(1)

TIMER_LIMIT = 5
setTimer = time.time()

while(1):

        print("hello world")
        if(time.time() - setTimer >= TIMER_LIMIT):
                doEvery_X_Seconds()
                setTimer = time.time()

There is time.sleep(1) only to demonstrate, that it works.

Upvotes: 0

Related Questions