function prepareCommand($address, $command, $data = array()) { $payload = ''; $payload .= makePayload(array($address)); $payload .= makePayload(array($command)); $payload .= makePayload(array(count($data))); if (count($data)) { $payload .= makePayload($data); } $payload .= crc16_modbus($payload); return $payload; }
while (microtime(1) < $timeout) { $c = fgetc($fp); if ($c === false) { usleep(5); continue; } $result .= $c; } fclose($fp); // Split answer data on parts $crc_answer = substr($result, -2); // crc16 in answer $addr = substr($result, 1, 3); // address of power device $answer_cmd = substr($result, 4, 1); // answered command $answer = substr($result, 5, -2); // answer string // Check CRC $crc_check = 'FAIL'; if (crc16_modbus(substr($result, 0, -2)) == $crc_answer) { $crc_check = 'OK'; } // Formatted output echo 'ADDRESS: ' . nice_hex(bin2hex($addr)) . "\n"; echo 'COMMAND: ' . nice_hex(bin2hex($answer_cmd)) . "\n"; echo 'ANSWER: ' . nice_hex(bin2hex($answer)) . "\n"; echo 'CRC: ' . $crc_check . "\n"; echo '---------' . "\n"; echo 'Full request: ' . nice_hex($cmd) . "\n"; echo 'Full answer: ' . nice_hex(bin2hex($result)) . "\n\n";