Benötige Hilfe bei CRC Funktion

Hi zusammen,

nachdem meine Buderus Platine auch in der Lage ist Telegramme zu senden, benötige ich noch ein passende Funktion für PHP um auch die CRC Berechnung durchzuführen. Könnte mir da jemand weiter helfen ?

for i in range(0,len(a)-1):
d = 0
if crc1 & 0x80:
crc1^=12
d = 1
crc1 = crc1 << 1
crc1 &= 0xfe
crc1 |= d
crc1 = crc1^int(a[i])

Das soll die Berechnung sein, aber wie mache ich daraus nun eine passende Funktion … stehe irgendwie aufm Schlauch :frowning:

Gruß
Jens

guck mal hier:
dort bauen manche auch funktionen um crcs für zb. wetterstationen zu berechnen:
http://php.net/manual/de/function.crc32.php

evtl. hilft das.

Hmm … ne, nicht wirklich :confused:

Im Prinzip ist die Formel ja schon fertig, nur ist das Python :rolleyes:
Ich blicke da aber leider nicht durch, wie diese Formel nun umzubauen ist, so das sie in IPS (also in PHP) zu benutzen ist.

Vielleicht die CRC berechnung aus dem Chromoflex RC Skript hier aus dem Forum mal anschauen, diese müsste genau das tuen was du brauchst.

Hä ???

Wie soll das denn bitte weiter helfen … ich habe doch (siehe erstes Posting) die Formel zur Berechnung, nur in der falschen „Sprache“ !?

Weil lt. Inet der Buderus ein CRC16 verwendet.
Chromoflex auch.

Versuch macht kluch.

//_________________________________________________________________________________________________ 

// Calc Checksumm 
//___________________________________________________________________________________________________ 

function CRC16($s)       // CRC16 reverse 
{ 
 $CRCreg = 0xffff << 1;   // Start 
 $PLYreg = 0xA001 << 1;   // Polynom 
 $len = strlen($s); 

 for ($cp=0; $cp<$len; $cp++) 
 { 
  $CRCreg ^= ord($s[$cp]) << 1; 
  for ($bp=0; $bp<8; $bp++) 
  { 
   $CRCreg >>= 1; 
   if ($CRCreg & 0x01) $CRCreg ^= $PLYreg; 
  } 
 } 
 $crc = $CRCreg >> 1; 
 $crcLo = $crc & 0xff; 
 $crcHi = $crc >> 8; 
 return chr($crcHi). chr($crcLo); 
} 

Frag mich aber bitte nicht wie und warum die Funktion funktioniert.
Ich habs mir damals auch nur geklaut.

Hi Bernhard,

danke für den Hinweis, aber woher hast du das mit CRC16? Wenn ich das Mikrocontroller Forum richtig verfolgt habe, dann war das für die Jungs nicht so ohne weiteres klar was für ein CRC Check verwendet wird, daher auch der „Eigenbau“ der Formel oben.
Werde mich am WE aber mal hin setzen und ein wenig testen.

Gruß
Jens

Reine Spekulation, :slight_smile:
Google liefert bei der Suche nach „Buderus CRC16“ mehrere Seiten am ersten Blick sinnvolle Einträge.

Durchgelesen hab ich aber nicht alles.

Wie gesagt,Versuch macht klug. Funktion mit Copy&Paste reinhacken ist ja kein großer Aufwand.

bb

Hmm …irgendwie hab ich da wohl etwas ggelöscht?

Wie muss die Übergabe bzw. der Aufruf der Bytes aussehen, wenn ich ein Ergebnis haben möchte?

Beispiel:
0B 10 3d 04 01 <Prüfsumme>

Einfach so ??

$PSum = CRC16("0b103d0401")

oder

$PSum = CRC16(chr(0x0B).chr(0x10).chr(0x3D).chr(0x04).chr(0x03))

Und wie stelle ich dann das Ergebnis als 2 Byte dar?

Gruß
Jens

Nach einigem hin und her, sollte das hier funktionieren und ist jedenfalls nicht einfach nur ein CRC16 (glaub ich zumindest :D)

function CRC16($String)
{
  $crc = 0;
  $d = 0;
  $pos = count($String);
  
  for($i=0; $i <= $pos-1; $i++){
    $d = 0;
    if ( $crc & 0x80 ){
      $crc ^= 0x0C;
      $d = 1;
    }
    $crc  = ($crc << 1) & 0xfe;
    $crc |= $d;
    $crc ^= $String[$i];
    
  }

  $x = $crc;
  return $x;
}

$String = array(0x0b,0x90,0x3d,0x07,0x01);

$Ergebnis = CRC16($String);
echo dechex($Ergebnis);
 

Wenn ich jetzt das hier ausführen möchte:



COMPort_SendText(33200 /*[Heizung]*/, "\x0b\x90\x3d\x07\x01\xaf\xaa\x55");

Wie mache ich das, das mein Stringarray in der benötigten Form + CRC direkt im Sendebefehl landet ohne das ich alles einzeln aus Strings zusammenbaue?

Gruß
Jens