Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 3 von 3

Thema: CRC-8 Berechnung

  1. #1
    Registriert seit
    13.12.2011
    Beiträge
    1.413
    Danke
    147
    Erhielt 160 Danke für 151 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    das Folgende läuft unter dem Motto "Denn er weiß nicht was er tut".
    Ich erstelle, unter anderem, ein Programm zur Berechnung einer CRC. Als Vorlage habe ich ein C++ Programm bekommen das ich in CODESYS wie folgt umgesetzt habe:

    Code:
    CRC := 0;
    
    FOR Counter1 := 4 TO XMod_BuffSize - 2 DO
        CRC := SHL(CRC XOR XModemBuffer[Counter1], 8);
        FOR Counter2 := 1 TO 8 DO
            IF CRC.15 THEN
                CRC := SHL(CRC, 1) XOR 16#1021;
            ELSE
                CRC := SHL(CRC, 1);
            END_IF
        END_FOR
    END_FOR
    CRC ist ein INT und XModemBuffer, wie geschrieben, ein Byte-Array.
    Was ich nicht wusste ist, dass es verschiedene CRCs gibt und der Code der Vorlage wohl für Words gedacht war, dass Array das ich jetzt bearbeite jedoch ein Byte-Array ist.
    Hat einer eine Idee wo ich was ändern muss? Ich habe natürlich schon nach der CRC-Berechnung gegoogelt und wurde mit Ergebnissen erschlagen, aber durchgestiegen bin ich leider nicht.
    Zitieren Zitieren Gelöst: CRC-8 Berechnung  

  2. "Hallo,

    Zitat Zitat von oliver.tonn Beitrag anzeigen
    Hallo,
    CRC ist ein INT und XModemBuffer, wie geschrieben, ein Byte-Array.
    Was ich nicht wusste ist, dass es verschiedene CRCs gibt und der Code der Vorlage wohl für Words gedacht war, dass Array das ich jetzt bearbeite jedoch ein Byte-Array ist.
    Hat einer eine Idee wo ich was ändern muss? Ich habe natürlich schon nach der CRC-Berechnung gegoogelt und wurde mit Ergebnissen erschlagen, aber durchgestiegen bin ich leider nicht.
    wenn ich das mit dem

    Code:
    uint16_t
    crc_xmodem_update (uint16_t crc, uint8_t data)
    {
    int i;
    crc = crc ^ ((uint16_t)data << 8);
    for (i=0; i<8; i++)
    {
    if (crc & 0x8000)
    crc = (crc << 1) ^ 0x1021;
    else
    crc <<= 1;
    }
    return crc;
    }
    sieht da ja schon recht ähnlich aus. Anhand der Datentypen siehst Du das es bereits für Bytes ist.
    Nur ist da eine Zeile Bei Dir falsch.

    Code:
    CRC := SHL(CRC XOR XModemBuffer[Counter1], 8);
    die müßte so lauten
    Code:
    CRC := CRC XOR SHL(BYTE_TO_WORD(XModemBuffer[Counter1]), 8);
    erst schieben, dann XOR

    Gruß"


  3. #2
    Registriert seit
    20.01.2012
    Beiträge
    98
    Danke
    0
    Erhielt 36 Danke für 34 Beiträge

    Standard

    Hallo,

    Zitat Zitat von oliver.tonn Beitrag anzeigen
    Hallo,
    CRC ist ein INT und XModemBuffer, wie geschrieben, ein Byte-Array.
    Was ich nicht wusste ist, dass es verschiedene CRCs gibt und der Code der Vorlage wohl für Words gedacht war, dass Array das ich jetzt bearbeite jedoch ein Byte-Array ist.
    Hat einer eine Idee wo ich was ändern muss? Ich habe natürlich schon nach der CRC-Berechnung gegoogelt und wurde mit Ergebnissen erschlagen, aber durchgestiegen bin ich leider nicht.
    wenn ich das mit dem

    Code:
    uint16_t
    crc_xmodem_update (uint16_t crc, uint8_t data)
    {
    int i;
    crc = crc ^ ((uint16_t)data << 8);
    for (i=0; i<8; i++)
    {
    if (crc & 0x8000)
    crc = (crc << 1) ^ 0x1021;
    else
    crc <<= 1;
    }
    return crc;
    }
    sieht da ja schon recht ähnlich aus. Anhand der Datentypen siehst Du das es bereits für Bytes ist.
    Nur ist da eine Zeile Bei Dir falsch.

    Code:
    CRC := SHL(CRC XOR XModemBuffer[Counter1], 8);
    die müßte so lauten
    Code:
    CRC := CRC XOR SHL(BYTE_TO_WORD(XModemBuffer[Counter1]), 8);
    erst schieben, dann XOR

    Gruß

  4. Folgender Benutzer sagt Danke zu Thruser für den nützlichen Beitrag:

    oliver.tonn (21.11.2014)

  5. #3
    Registriert seit
    13.12.2011
    Beiträge
    1.413
    Danke
    147
    Erhielt 160 Danke für 151 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Thruser,
    danke für die schnelle Antwort.
    Mea culpa, meine C++ Kenntnisse sind doch arg eingerostet und so habe ich die Reihenfolge verwechselt. Irgendwo klemmt es immer noch, aber das muss eine andere Ursache haben.

Ähnliche Themen

  1. MPI CRC Berechnung
    Von Hannes im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 20.07.2007, 13:37
  2. Crc-16
    Von DaBorstel im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 30.05.2006, 21:16
  3. Antworten: 1
    Letzter Beitrag: 23.09.2005, 13:56
  4. CRC 16
    Von pramic im Forum Programmierstrategien
    Antworten: 0
    Letzter Beitrag: 06.09.2005, 13:51
  5. CRC 16
    Von pramic im Forum Programmierstrategien
    Antworten: 4
    Letzter Beitrag: 27.07.2005, 11:25

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •