Hallo zusammen,
für die Kommunikation in Richtung Wechselrichter benötige ich eine CRC Berechnung. Leider schlägt das fehl
Der Frame auf dem RS485 Bus hat folgendes Format:
02 3a 00 20 20 20 20 20 c9 59, wobei die letzten beiden Bytes (c9 59) die CRC Checksumme über die vorderen 8 Bytes bilden.
Ich habe versucht einen Perl Code in PHP zu übernehmen. Der Perl Code der CRC Funktion sieht so aus:
sub crc {
my $str = shift;
my $crc = 0xffff;
foreach my $chr (unpack 'C*', $str) {
for (my $i = 0, my $data =int 0xff & $chr; $i < 8; $i++, $data >>= 1) {
$crc = ($crc & 0x0001) ^ ($data & 0x0001) ? ($crc >> 1) ^ 0x8408 : $crc >> 1;
}
}
return 0xffff & ~$crc;
}
Folgenden PHP Code habe ich daraus gebastelt:
function crc_ccitt ($str){
$crc = 0xffff;
$str = unpack("C*",$str);
$F=0;
foreach ($str as $chr){
// for (my $i = 0, my $data =int 0xff & $chr; $i < 8; $i++, $data >>= 1) {
for ($i = 0, $data =$chr&0xff; $i < 8; $i++, $data >>= 1) {
$crc = ($crc & 0x0001) ^ ($data & 0x0001) ? ($crc >> 1) ^ 0x8408 : $crc >> 1;
}
}
return 0xffff & ~$crc;
}
Nach stundenlangem Trial & Error komme ich nicht weiter.
Kann mir jemand sagen, wie ich mittels PHP aus dem String:
02 3a 00 20 20 20 20 20 die Checksumme c9 59 bekomme?
Besten Dank und Gruß,
Kai
EDIT:
Thema hat sich erledigt, die Antwort findet sich im Script von elektroniktommy in folgendem Thread: