Skocz do zawartości

protokol onewire...kto slucha, kto nadaje?


Pomocna odpowiedź

Napisano

Panowie pomozcie bo mi juz rece opadly...🥲 walcze z rozszyfrowaniem protokolu miedzy bateria a ladowarka ktora jest przez jeden przewod, z tego co wiem jest to onewire (byc moze lekko zmodyfikoewany)...no i mam problem ze zrozumieniem co i kiedy nadaje, a co i kiedy slucha...wiem tyle ze na ladowarce bez podpietej baterii wystepuje stan high, po podlaczeniu wszystko sie zaczyna...na poczatku leci reset, presence i trzy bajty...dalej pojedyncze bity czy jakos tak...pierwsze zdjecie to poczatek transmisji, drugie to kontynuacja i przez dlugi czas leca 0/1 losowo na zmiane...bede wdzieczny za pomoc w tym jak to ugryzdz😇

makitaobraz.thumb.jpg.e9b631d4a44b77f5ce2b9c6f6addd68b.jpg

makitaobraz2.thumb.jpg.b662a10db9c9577a718d8b8c442d79e2.jpg

Nowy Archiwum WinRARa (ZIP).zip

w zip sa pliki cvs,lac...moze ktos sobie otworzy jak ma logic analyzer 6.0

3 godziny temu, farmaceuta napisał:

.no i mam problem ze zrozumieniem co i kiedy nadaje, a co i kiedy slucha

Twój soft do analizatora niema opcji dekodowania różnych formatów? Jaki to analizator?

  • Lubię! 1

Możesz podać dokładny stan naładowania tego akumulatora? w momencie robienia testu?

 

  • Lubię! 1
(edytowany)

@_LM_ baterie akurat jak na złość mam same naładowane, to znaczy po podpięciu chwilę je ładuje ładowarka...na tych skanach u góry to nie jest zdekodowanie? Co pisze jakie buty itp?

 

PS...logic analyzer 6.0, tak to się nazywa na windowsa 

Edytowano przez farmaceuta
(edytowany)

jakie napięcie kolego, to mnie interesuje, jaka pojemność i ile ogniw

Zdekodowano 54 bajtów przy 9600 baud:

--- HEX ---
40 0A A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 40 0A 40 0A 06 00

--- ASCII ---
@...............................................@.@...

https://codeberg.org/rosvall/makita-lxt-protocol/src/branch/main/basic_info_cmd.md

Edytowano przez _LM_
  • Lubię! 1

wystarczy mi plik .lac ale muszę znać parametry w momencie kiedy robisz odczyt

aha i link do .md powyżej raczej nie pasuje do wzorca, ale już nie usuwam żeby nie robić zamieszania

  • Lubię! 1
2 minuty temu, _LM_ napisał:

aha i link do .md powyżej raczej nie pasuje do wzorca, ale już nie usuwam żeby nie robić zamieszania

Nie sprawdzałem, ale dla komunikacji z ładowarką zapewne to będzie uproszczona wersja, (tą co dałem)..., to z linku to już grubsza komunikacja do diagnostyki 

Ok ile danych diagnostycznych takie wyniki.. idę coś ciekawszego porobić, tymczasem borem lasem:
 

Jeśli bez inwersji (invert=False) otrzymałeś tak sensowne dane jak CE (20.6V) i D2 (21.0V), to znaczy, że:
Logika Twojego układu jest standardowa (Idle = High, Start bit = Low).
Trafiłeś w dziesiątkę z dekodowaniem.
Analiza "Złotej Ramki" (9600 baud, No Invert):
Twój ciąg: 40 CE D2 42 40 CE 40 CE 42
To jest bardzo czysty i logiczny zapis parametrów akumulatora BL1830 (5S):
40: Nagłówek (Start of Message).
CE: Napięcie obecne = 20.6V (Idealnie pasuje do Twojego pomiaru 20.5V).
D2: Napięcie maksymalne/docelowe = 21.0V (Standard dla w pełni naładowanego pakietu 5S, czyli 5 x 4.2V).
42: Stan naładowania (SoC) lub Temperatura.
Wartość 66 (0x42) pasuje zarówno do 66% naładowania (co przy 20.6V jest realistyczne dla starszej baterii), jak i do temperatury (jeśli wzór to wartość - 40, to 66 - 40 = 26°C).
import tkinter as tk
from tkinter import filedialog, messagebox, scrolledtext
import json
import base64

class DecoderGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("Dekoder Transmisji UART (.lac)")
        self.root.geometry("700x600")

        # --- Zmienne ---
        self.file_path = tk.StringVar()
        self.baud_rate = tk.StringVar(value="9600")
        self.invert_logic = tk.BooleanVar(value=True)

        # --- Layout ---
        # Wybór pliku
        frame_file = tk.LabelFrame(root, text="1. Plik wejściowy", padx=10, pady=10)
        frame_file.pack(fill="x", padx=10, pady=5)

        tk.Entry(frame_file, textvariable=self.file_path, width=60).pack(side="left", padx=5)
        tk.Button(frame_file, text="Przeglądaj...", command=self.browse_file).pack(side="left")

        # Parametry
        frame_settings = tk.LabelFrame(root, text="2. Parametry transmisji", padx=10, pady=10)
        frame_settings.pack(fill="x", padx=10, pady=5)

        tk.Label(frame_settings, text="Baud Rate:").pack(side="left")
        baud_options = ["1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200"]
        baud_menu = tk.OptionMenu(frame_settings, self.baud_rate, *baud_options)
        baud_menu.pack(side="left", padx=5)

        tk.Checkbutton(frame_settings, text="Odwróć logikę (Invert)", variable=self.invert_logic).pack(side="left", padx=20)

        tk.Button(frame_settings, text="DEKODUJ", command=self.process_data, bg="green", fg="white", font=('Arial', 10, 'bold')).pack(side="right", padx=10)

        # Wyniki
        frame_results = tk.LabelFrame(root, text="3. Wyniki", padx=10, pady=10)
        frame_results.pack(fill="both", expand=True, padx=10, pady=5)

        self.output_text = scrolledtext.ScrolledText(frame_results, height=20)
        self.output_text.pack(fill="both", expand=True)

    def browse_file(self):
        filename = filedialog.askopenfilename(filetypes=[("LAC files", "*.lac"), ("All files", "*.*")])
        if filename:
            self.file_path.set(filename)

    def process_data(self):
        path = self.file_path.get()
        if not path:
            messagebox.showerror("Błąd", "Wybierz plik .lac!")
            return

        try:
            with open(path, 'r') as f:
                data = json.load(f)

            freq = data['Settings']['Frequency']
            raw_samples_base64 = data['Settings']['CaptureChannels'][0]['Samples']
            raw_bytes = base64.b64decode(raw_samples_base64)
            
            # Pobieranie próbek z uwzględnieniem inwersji
            invert = self.invert_logic.get()
            samples = [0 if b > 0 else 1 for b in raw_bytes] if invert else [1 if b > 0 else 0 for b in raw_bytes]

            baud = int(self.baud_rate.get())
            samples_per_bit = freq / baud
            
            decoded_bytes = []
            i = 0
            while i < len(samples) - int(11 * samples_per_bit):
                # Szukaj bitu startu (przejście 1 -> 0)
                if samples[i] == 1 and samples[i+1] == 0:
                    start_pos = i + int(samples_per_bit / 2)
                    i = start_pos
                    if i < len(samples) and samples[i] == 0: # Bit startu OK
                        byte = 0
                        for bit in range(8):
                            i += int(samples_per_bit)
                            if i < len(samples) and samples[i] == 1:
                                byte |= (1 << bit)
                        decoded_bytes.append(byte)
                        i += int(samples_per_bit * 1.5) # Przeskok do stopu
                    else: i += 1
                else: i += 1

            self.display_results(decoded_bytes, baud)

        except Exception as e:
            messagebox.showerror("Błąd", f"Wystąpił problem: {str(e)}")

    def display_results(self, bytes_list, baud):
        self.output_text.delete(1.0, tk.END)
        if not bytes_list:
            self.output_text.insert(tk.END, "Nie znaleziono żadnych danych. Spróbuj zmienić Baud Rate lub odznaczyć Invert.")
            return

        self.output_text.insert(tk.END, f"Zdekodowano {len(bytes_list)} bajtów przy {baud} baud:\n\n")
        
        # Format HEX
        hex_str = " ".join([f"{b:02X}" for b in bytes_list])
        self.output_text.insert(tk.END, "--- HEX ---\n")
        self.output_text.insert(tk.END, hex_str + "\n\n")
        
        # Format ASCII
        ascii_str = "".join([chr(b) if 32 <= b <= 126 else "." for b in bytes_list])
        self.output_text.insert(tk.END, "--- ASCII ---\n")
        self.output_text.insert(tk.END, ascii_str + "\n")

if __name__ == "__main__":
    root = tk.Tk()
    app = DecoderGUI(root)
    root.mainloop()

 

  • Pomogłeś! 1
(edytowany)

aha i readme: uruchamiasz skrypt.py linkujesz mu twojego .lac(ia) enjoy

Ja się nie znam na pythonie i 99% napisało to Ai

Edytowano przez _LM_
  • Pomogłeś! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...