Bei falscher CRC wird die Sendung als fehlerhaft betrachtet und per NACK quittiert, so sollte es zumindest sein. Hier mal ein Skript, das bei mir die Therme dazu bringt, ein paar nützliche Daten zu senden:
<?
// Slave-Addr eines Master entspricht Master-Addr + 5
// Uhr auslesen
/*
$sourceAddr = 0x00;
$destAddr = 0x03 + 5;
$primCmd = 0xB5;
$secCmd = 0x04;
$dataBytes[] = 0x00;//*/
// Vorlauf und Rücklauf auslesen
///*
$sourceAddr = 0x00;
$destAddr = 0x03 + 5;
$primCmd = 0xB5;
$secCmd = 0x11;
$dataBytes[] = 0x01; // 1 bzw 2 //*/
// Kesseltemp. setzen?
/*
$sourceAddr = 0x00;
$destAddr = 0x08;
$primCmd = 0xB5;
$secCmd = 0x05;
$dataBytes[] = 0x2D;
$dataBytes[] = 0x00;
$dataBytes[] = 0x32;
$dataBytes[] = 0x00; //*/
$myString = zeropad(dechex($sourceAddr)) .
zeropad(dechex($destAddr)) .
zeropad(dechex($primCmd)) .
zeropad(dechex($secCmd)) .
zeropad(count($dataBytes));
for($i = 0; $i < count($dataBytes); $i++)
$myString .= zeropad(dechex($dataBytes[$i]));
echo $myString;
COMPort_SendText (54486 /*[USB (virt. RS232) für eBus-Koppler]*/ , add_crc(hexToStr($myString)));
function zeropad($num)
{
return (strlen($num) == 1) ? '0'.$num : $num;
}
// ----------------------------------------------------------------------------------------------------------------
function build_crc_byte($byte, $crc) {
$ChecksumArray = array (
0x00, 0x9B, 0xAD, 0x36, 0xC1, 0x5A, 0x6C, 0xF7, 0x19, 0x82, 0xB4, 0x2F, 0xD8, 0x43, 0x75, 0xEE,
0x32, 0xA9, 0x9F, 0x04, 0xF3, 0x68, 0x5E, 0xC5, 0x2B, 0xB0, 0x86, 0x1D, 0xEA, 0x71, 0x47, 0xDC,
0x64, 0xFF, 0xC9, 0x52, 0xA5, 0x3E, 0x08, 0x93, 0x7D, 0xE6, 0xD0, 0x4B, 0xBC, 0x27, 0x11, 0x8A,
0x56, 0xCD, 0xFB, 0x60, 0x97, 0x0C, 0x3A, 0xA1, 0x4F, 0xD4, 0xE2, 0x79, 0x8E, 0x15, 0x23, 0xB8,
0xC8, 0x53, 0x65, 0xFE, 0x09, 0x92, 0xA4, 0x3F, 0xD1, 0x4A, 0x7C, 0xE7, 0x10, 0x8B, 0xBD, 0x26,
0xFA, 0x61, 0x57, 0xCC, 0x3B, 0xA0, 0x96, 0x0D, 0xE3, 0x78, 0x4E, 0xD5, 0x22, 0xB9, 0x8F, 0x14,
0xAC, 0x37, 0x01, 0x9A, 0x6D, 0xF6, 0xC0, 0x5B, 0xB5, 0x2E, 0x18, 0x83, 0x74, 0xEF, 0xD9, 0x42,
0x9E, 0x05, 0x33, 0xA8, 0x5F, 0xC4, 0xF2, 0x69, 0x87, 0x1C, 0x2A, 0xB1, 0x46, 0xDD, 0xEB, 0x70,
0x0B, 0x90, 0xA6, 0x3D, 0xCA, 0x51, 0x67, 0xFC, 0x12, 0x89, 0xBF, 0x24, 0xD3, 0x48, 0x7E, 0xE5,
0x39, 0xA2, 0x94, 0x0F, 0xF8, 0x63, 0x55, 0xCE, 0x20, 0xBB, 0x8D, 0x16, 0xE1, 0x7A, 0x4C, 0xD7,
0x6F, 0xF4, 0xC2, 0x59, 0xAE, 0x35, 0x03, 0x98, 0x76, 0xED, 0xDB, 0x40, 0xB7, 0x2C, 0x1A, 0x81,
0x5D, 0xC6, 0xF0, 0x6B, 0x9C, 0x07, 0x31, 0xAA, 0x44, 0xDF, 0xE9, 0x72, 0x85, 0x1E, 0x28, 0xB3,
0xC3, 0x58, 0x6E, 0xF5, 0x02, 0x99, 0xAF, 0x34, 0xDA, 0x41, 0x77, 0xEC, 0x1B, 0x80, 0xB6, 0x2D,
0xF1, 0x6A, 0x5C, 0xC7, 0x30, 0xAB, 0x9D, 0x06, 0xE8, 0x73, 0x45, 0xDE, 0x29, 0xB2, 0x84, 0x1F,
0xA7, 0x3C, 0x0A, 0x91, 0x66, 0xFD, 0xCB, 0x50, 0xBE, 0x25, 0x13, 0x88, 0x7F, 0xE4, 0xD2, 0x49,
0x95, 0x0E, 0x38, 0xA3, 0x54, 0xCF, 0xF9, 0x62, 0x8C, 0x17, 0x21, 0xBA, 0x4D, 0xD6, 0xE0, 0x7B);
$result = ($ChecksumArray[ord($byte)] ^ $crc);
$result = ($ChecksumArray[$crc] ^ ord($byte));
return $result;
}
// ----------------------------------------------------------------------------------------------------------------
function build_crc($message) {
$crc = 0;
for ($i=0 ; $i<strlen($message) ; $i++) {
$crc = build_crc_byte(substr($message,$i,1), $crc);
}
return chr($crc);
}
// ----------------------------------------------------------------------------------------------------------------
function add_crc($message) {
return $message.build_crc($message);
}
// ----------------------------------------------------------------------------------------------------------------
function strToHex ($str) {
$result = '';
for ($i = 0; $i < strlen($str); $i++) {
$result .= strtoupper(((strlen(dechex(ord($str[$i]))) < 2) ? '0' : '').dechex(ord($str[$i])));
}
return $result;
}
// ----------------------------------------------------------------------------------------------------------------
function hexToStr($hex) {
$string='';
for ($i=0; $i < strlen($hex)-1; $i+=2) {
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
?>
Hübsch formatiert und gekapselt gibt es das ganze leider noch nicht, ist halt alles noch in der „Hacking“-Phase.