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