SML-Prüfsummenberechnung: Ich verzweifle an CRC

  • Leider krieg ich trotz vieler Versuche keine funktionierende Prüfsummenberechnung (CRC) in den SML-Nachrichten hin.
    Kann hier irgendjemand helfen?


    Ich habe mal eine Beispielnachricht w4.log angehängt.


    Folgende Erkenntnisse, müssen aber nicht stimmen:
    1.) Die Nachricht hat 336 Byte
    2.) Die letzten zwei Byte sind die Prüfsumme
    3.) Das drittletzte Byte ist ein Füllbyte
    4.) Die Prüfsumme wird von Byte Nummer 1 bis 333 berechnet, Numerierung startet bei 1
    5.) Als CRC Berechnung muss wohl x.25 verwendet werden
    6.) Für X.25 habe ich einen Code umgeschrieben, der auch mit einem Teststring richtig arbeitet
    7.) Es gibt auch innerhalb der Nachricht nochmal Prüfsummen, ich versuche im Moment, die Gesamtprüfsumme über die Gesamtnachricht zu berechnen.



    Habe keine Plan, wie ich da weiterkomme, und bin für jede Hilfe dankbar.


    Thomas


    PS: Habs da auch mal probiert:
    http://www.mikrocontroller.net/topic/246407#2683857

    Dateien

    • w4.log

      (336 Byte, 119 Mal heruntergeladen, zuletzt: )

    ____
    http://wiki.freesol.de - Ein freier Datenlogger für 30 EUR

  • Wirklich keiner irgendeine Idee, oder keiner da, der mit irgendeinem (von mir aus auch c-Programm) die Prüfsummenberechnung schon mla zum Laufen bekommen hat?


    Thomas

  • Hast Du als RefPoly einemal 0x1021 ausprobiert ?
    Ich könnte mich mal nach Pfingsten damit beschäftigen und einen Kollegen fragen der desöfteren mit CRC im Allgemeinen zu tun hat ...


    LG,
    Alex

  • Ich GLAUBE, dass mein Problem eins von zwei Möglichkeiten ist:
    a.) falscher Prüfsummenalgorithmus (funktioniert auf dem mitgelieferten Teststring richtig, aber erst gibt halt viele Berechnungsvarianten)
    b.) Falscher Berechnungsbereich (mir ist nicht ganz klar, von wo bis wo die Prüfsumme berechnet wird)


    Ich habe gestern mal angefangen, das C-Programmpaket smllib
    https://github.com/tobiasjeske/SMLlib


    durchzusehen. Ich müsste das nun zum Laufen bekommen, für mein oben angehängtes Logfile mal die Prüfsumme ausrechnen und dabei feststellen, von welcher bis welcher Position sie berechnet wird. Dazu brauch ich erstmal nen passenden c-compiler und muss mich wieder in c eindenken, was nicht meine Stärke ist.


    Falls das Programm die richtige Prüfsumme ausrechnet und ich Start und Endposition verstanden habe, geht die eigentliche Portierung dann schnell ...


    Die richtigen Funktionen in SMLLIB habe ich gestern schnell gefunden, aber im Detail verstanden hab ichs noch nicht.

  • Zitat von tfv

    ... Dazu brauch ich erstmal nen passenden c-compiler und muss mich wieder in c eindenken, was nicht meine Stärke ist.
    ...


    zum Ausprobieren ...
    Deine Vorlieben für Programmiersprachen wirst Du selber besser kennen, aber vielleicht hilft dazu auch Visual Basic in Excel (->compiler integriert)?
    (und Google mit 'Visual Basic Crc" ...)


    (und sorry der Name ist Lammert Bies und smllib vermutlich mit Gnu public license)

  • In Visual Basic läuft meine CRC Routine ja schon im Programm FreeSol SML.
    Mein problem ist, dass sie andere Ergebnisse liefert und ich jetzt irgendein Programm brauche, das die richtigen CRC-Werte rauskriegt, damit ich meinen Fehler finden kann ...

  • Zitat von tfv

    In Visual Basic läuft meine CRC Routine ja schon im Programm FreeSol SML.
    Mein problem ist, dass sie andere Ergebnisse liefert und ich jetzt irgendein Programm brauche, das die richtigen CRC-Werte rauskriegt, damit ich meinen Fehler finden kann ...


    statt Excel vielleicht auch OpenOffice (nur sind die Makros wieder in anderen Programmiersprachen)
    -> in der Tabellenkalkulation den Algorithmus ausprobieren (Startbyte, Stoppbyte ermitteln, High-, LowByte Reihung des Crc-Wertes in binärer Darstellung (little, big endian?)? - es gibt etliche Kombinationsmöglichkeiten (und wirklich hervorragende Dokumentation kenne ich soweit_gehend bisher von Sma ...)

  • So, diese dumme Prüfsummenberechnung habe ich nun endlich geknackt. Danke für die vielen Hinweise.


    Geholfen hat mir der Code von libsml, nachdem ich aufgrund meiner begrenzten C-Praxis bei SMLLib und vzlogger einfach nicht durchgeblickt habe :oops:


    Hier nochmal der Originalcode im Kommentar und meine VBasic-Implementierung.


    Die Startposition der Pürfsummenberechnung ist das erste Byte von 1B 1B 1B 1B 01 01 01 01, die letzte noch in der Prüfsumme enthaltene Position ist (erstes Byte der Sequenz 1B 1B 1B 1B 1A) + 5 Positionen (das ist das Byte nach der Sequenz 1B 1B 1B 1B 1A; dieses ist noch enthalten), direkt danach schließen sich die 2 Byte der so berechneten Prüfsumme an.


  • So, jetzt habe ich noch ein Problem:


    Für das schnelle Implementieren im Board wäre natürlich eine fertige Routine besser. Gefunden habe ich bein Bascom die Routine CRC16UNI, bei der man die CRC-Einstellung recht allgemein paramterieren kann.


    Die oben beschriebene von mir erfolgreich implementierte Routine gibt auf dem Teststring "123456789" das Ergebnis 6E90, dieses kommt bei den unten beschriebenen Paramatern nicht vor.


    Etwas mehr Theorie zur CRC-Verschlüsselung bei SML brauche ich also immer noch ...