У меня есть последовательное устройство (Arduino), регулярно выводящее данные журнала, которые должны записываться в файл журнала. Также устройство принимает спонтанные команды через последовательный порт. Я отправляю команды в Raspberry over Telegram, которые обрабатываются и отправляются в arduino Telepot, который работает в отдельном потоке.
Как я могу убедиться, что два процесса ладят друг с другом?
Я полный новичок в многопоточности.
Вот сокращенная версия моего кода:
import time
import datetime
import telepot
import os
import serial
from time import sleep
ser = None
bot = None
def log(data):
with open('logfile', 'w') as f:
file.write("Timestamp" + data)
#The handle Function is called by the telepot thread,
#whenever a message is received from Telegram
def handle(msg):
chat_id = msg['chat']['id']
command = msg['text']
print( 'Command Received: %s' % command)
if command = '/start':
bot.sendMessage(chat_id, 'welcome')
elif command == 'close_door':
#This serial write could possibly happen while a
#ser.readline() is executed, which would crash my program.
ser.write("Close Door")
elif command == 'LOG':
#Here i should make sure that nothing
#is waiting from the Arduino
#so that the next two Serial lines are the Arduinos
#respoonce to the "LOG" command.
#and that hanlde is the only
#function talking to the Serial port now.
ser.write("LOG")
response = ser.readline()
response += "\0000000A" + ser.readline()
#The Arduinos response is now saved as one string
#and sent to the User.
bot.sendMessage(chat_id, response)
print("Command Processed.")
bot = telepot.Bot('BOT TOKEN')
bot.message_loop(handle)
ser = serial.Serial("Arduino Serial Port", 9600)
print( 'I am listening ...')
while True:
#anything to make it not run at full speed (Recommendations welcome)
#The log updates are only once an hour.
sleep(10)
#here i need to make sure it does not collide with the other thread.
while ser.in_waiting > 0:
data = ser.readline()
log(data)
Этот код не является моим настоящим кодом, но он должен точно представлять, что я пытаюсь сделать.
Мое последнее средство было бы поместить последовательный код в функцию цикла потоков, но для этого потребовалось бы изменить библиотеку, что было бы ужасно.
Я посмотрел кое-что об очередях в Асинсио и функциях блокировки. Однако я не очень понимаю, как это применить. Также я не использую асинхронный телепот.