checkmsg.pl 680 B

12345678910111213141516171819202122232425262728
  1. #!/usr/bin/perl
  2. die("Usage: checkmsg HEX-FHZ-MESSAGE\n") if(int(@ARGV) != 1);
  3. my $msg = $ARGV[0];
  4. die("Bad prefix (not 0x81)\n") if($msg !~ m/^81/);
  5. print("Prefix is ok (0x81)\n");
  6. my $l = hex(substr($msg, 2, 2));
  7. my $rl = length($msg)/2-2;
  8. die("Bad length $rl (should be $l)\n") if($rl != $l);
  9. print("Length is ok ($l)\n");
  10. my @data;
  11. for(my $i = 8; $i < length($msg); $i += 2) {
  12. push(@data, ord(pack('H*', substr($msg, $i, 2))));
  13. }
  14. my $rcrc = 0;
  15. map { $rcrc += $_; } @data;
  16. $rcrc &= 0xFF;
  17. my $crc = hex(substr($msg, 6, 2));
  18. my $str = sprintf("Bad CRC 0x%02x (should be 0x%02x)\n", $crc, $rcrc);
  19. die($str) if($crc ne $rcrc);
  20. printf("CRC is ok (0x%02x)\n", $crc);
  21. exit(0);