CRC Checksumme

Mathias
Benutzer
Avatar
Geschlecht: keine Angabe
Herkunft: Weingarten - Baden
Beiträge: 315
Dabei seit: 07 / 2003
Betreff:

CRC Checksumme

 · 
Gepostet: 28.04.2022 - 15:32 Uhr  ·  #1
Hallo,
möchte Strings die über die serielle Schnittstelle versendet werden mit einem Prüfsummenbyte versehen.
Compilerhandbuch: 4.13.11 CRC Checksumme
Verstehe nicht wie man es auf Strings anwendet.

Beispiel:
WriteLn(SerOut1, StfTemperatur1 + StfTemperatur2 + Checksumme);

Auch, wie geht's umgekehrt, einen empfangenen Datensatz prüfen?
Wie macht ihr soetwas?
Einfach ein paar Codebeispiele würde viel nützen.

Danke
pvs-deck
PowerUser
Avatar
Geschlecht:
Alter: 54
Beiträge: 1343
Dabei seit: 02 / 2009
Betreff:

Re: CRC Checksumme

 · 
Gepostet: 28.04.2022 - 17:57 Uhr  ·  #2
Hallo Mathias,

im Prinzip ist der String nichts anderes als ein Block im Speicher, also kann man diesen ohne Probleme mit den Adresspointern adressieren.

Ich nutze den CRC z.B. zum prüfen ob etwas im EEPROM der CPU nicht mehr in Ordnung ist, wenn dies der Fall ist lade ich die letzten Standardwerte auf der SDCARD.

Hier mal meine Codebeispiele, ich nutze die Funktion CalcCheckSum(), da es bei mir EEPROM-Speicher ist, der Compiler muss das wissen da er diesen Speicherbereich anderst adressieren muss:

Code
//---------------------------------------------------------------
// Errechne Config CRC und lege diese im RTCRAM ab 
//
procedure CalcCfgCRC;
var 
 wCRC_Buffer : word;
 
begin
 wCRC_Buffer:= CalcCheckSum (@Cfg1, @BInvalidateBoot); // Berechne CRC
 lock(self);
  wCRC_Config_RTC:= wCRC_Buffer;  // Lege den Wert im RTC-Ram ab Userdevice
  unlock(self);
   LogString('Eprom CRC: '+IntToHex(wCRC_Buffer)); // Logbucheintrag auf SD-Card mir CRC erzeugen
end CalcCfgCRC;


Code
//-----------------------------------------------------------------------------
// Prüfe CRC cfg
function CheckCfgCRC : boolean;  
var 
 wCRC_Buffer : word;

begin
 wCRC_Buffer:= CalcCheckSum (@Cfg1, @BInvalidateBoot); // Berechne CRC
  LogString('EECRC: '+IntToHex(wCRC_Buffer)+ ' / RTCCRC: '+IntToHex(wCRC_Config_RTC) );

  if wCRC_Config_RTC <> wCRC_Buffer then
     return(false);
    else
     return(true);  
    endif;
end CheckCfgCRC; // CheckCfgCRC


Ich würde an Deiner Stelle (ungetestet):
WriteLn(SerOut1, StfTemperatur1 + StfTemperatur2 + Checksumme);

wie folgt vorgehen:
Code
.....
var
 strBuffer : string[100];  // Je nachdem wie Deine max. Länge aussieht
 wCRCWert : word; // Zwischenspeicher CRC Check

begin
 strBuffer :=  StfTemperatur1 + StfTemperatur2;

wCRCWert := CRCcheck( @strBuffer[1], Length(strBuffer) );

WriteLn(SerOut1, strBuffer + ';'IntToHex(Checksumme) );
..... 


Wenn ich die Sache als String über eine Ser.-Ausgabe machen würde, würde ich die CRC immer als HEX ausgeben und mit einem ";" trennen. Bei der Empfangsstelle prüfst Du dann auch wieder, aber nur bis zum ";".

Gruß

Thorsten
Mathias
Benutzer
Avatar
Geschlecht: keine Angabe
Herkunft: Weingarten - Baden
Beiträge: 315
Dabei seit: 07 / 2003
Betreff:

Re: CRC Checksumme

 · 
Gepostet: 29.04.2022 - 11:11 Uhr  ·  #3
Danke,
werde es die Tage ausprobieren.
Melde mich wieder.
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.
MySQL Queries: 14 · Cache Hits: 14   66   80 · Page-Gen-Time: 0.022902s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI