Files
JackBot/ArduinoCommunication.py
JackM323 c34449aac5 Project Initialization
First Upload to Gitea
2026-07-29 19:23:45 +02:00

74 lines
2.6 KiB
Python

from threading import Thread, Event
from queue import Queue
import numpy as np
import serial
import time
import config as cfg
import DataTypes as dt
class ArduinoCommunication(Thread):
def __init__(self, port=cfg.port, baudrate=cfg.baudrate, timeout=cfg.timeout):
super().__init__()
self.daemon = True # Thread schließt sich beim Programmende
self.serial_conn = serial.Serial(port, baudrate, timeout=timeout)
time.sleep(2) # Warten bis Arduino ready
self.command_queue = Queue()
self.response_queue = Queue()
self.running = Event()
self.running.set()
def run(self):
while self.running.is_set():
# 1. Befehle senden
if not self.command_queue.empty():
command = self.command_queue.get()
self._write(command)
# 2. Antwort lesen (falls vorhanden)
if self.serial_conn.in_waiting > 0:
line = self.serial_conn.readline().decode('utf-8', errors='ignore').strip()
if line:
print(f"[Arduino] {line}")
self.response_queue.put(line)
time.sleep(0.01)
# Werte auf Arduino schreiben
def write(self, target):
if isinstance(target, dt.RadArray):
target = dt.DegArray(np.degrees(target.data))
if self.serial_conn and self.serial_conn.is_open:
leg_str = '\n'.join([','.join(map(str, row)) for row in target])
formatted_data = f"<{leg_str}>"
print(f"Gesendete Daten:\n{formatted_data}")
self.serial_conn.write(bytes(formatted_data, 'utf-8'))
# Werte von Arduino ablesen und Synchronisierunga
def wait4arduino(self, expected_message):
while True:
# Lese eine Zeile von der seriellen Verbindung
data = self.serial_conn .readline()
# Konvertiere die Zeile in einen lesbaren String
data = str(data, "utf-8").strip("\r\n")
# Debugging-Ausgabe (optional)
print(f"Empfangene Daten: {data}")
# Ueberpruefe, ob die empfangene Nachricht der erwarteten Nachricht entspricht
if data == expected_message:
print("Bewegung abgeschlossen!")
break
else:
time.sleep(0.05)
def _write(self, message):
if self.serial_conn and self.serial_conn.is_open:
self.serial_conn.write(message.encode('utf-8'))
def stop(self):
self.running.clear()
self.join()
self.serial_conn.close()