CRC Checksumme

Mathias
Benutzer
Avatar
Gender: n/a
Location: Weingarten - Baden
Posts: 310
Registered: 07 / 2003
Subject:

CRC Checksumme

 · 
Posted: 28.04.2022 - 15:32  ·  #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
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: CRC Checksumme

 · 
Posted: 28.04.2022 - 17:57  ·  #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
Gender: n/a
Location: Weingarten - Baden
Posts: 310
Registered: 07 / 2003
Subject:

Re: CRC Checksumme

 · 
Posted: 29.04.2022 - 11:11  ·  #3
Danke,
werde es die Tage ausprobieren.
Melde mich wieder.
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   66   80 · Page-Gen-Time: 0.021514s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI