22. november 2002 - 16:38Der er
11 kommentarer og 1 løsning
Checksum på datatelegram iht ISO1155
Jeg har et seriel data telegram som der skal afsluttes med en checksum, hvor protokollen for telegrammet siger:
The block check character shall be the modulo 2 binary sum of the characteres in the transmitted block. The longitudinal parity including the BCC shall be made even.
Eksempel på telegram: 1 65 2 65 31 66 67 68 30 og tilsidst BCC Hvor BCC er checksummen.
Det er decimal tal, havde jeg bare en korrekt udregnet checksum, så havde jeg nok fundet løsningen. Det skulle bl.a være et eller andet med de enkelte bit lagt sammen vandret, (bit 0 i første, med bit 0 i næste osv) og så pariteten af disse.
Følgende lille program burde kunne klare det - jeg har indsat et par ekstra testudskrifter så du kan se hvad der foregår.
Mvh Jesper Naur
#include <stdio.h>
unsigned char CalculateBCC( unsigned char *buf, int len ) { unsigned char bcc = 0; /* initial BCC value 0 */ int i; for (i = 0; i < len; i++) { bcc = bcc ^ buf[i]; /* perform XOR between bcc and next byte */ }
/* print buffer and result in hexadecimal */ printf("buf"); for (i = 0; i < len; i++) { printf(" %02X", buf[i]); } printf(" bcc %02X\n", bcc); return bcc; }
Et program i C kan jeg desværre ikke bruge til så meget, havde det været VB så var det ok. Er du sikker på at det "bare" er en exclusive or der skal foretages ?
Selve udregningen skal foregå i en microprocessor og skrives i assembler til Motorola 68HC11, det er ikke det store problem at skrive rutinen, når bare jeg ved hvordan det udregnes.
I samtlige telegrambytes inklusive BCC byten, skal der være et lige (even) antal 1-taller i bit 0. I samtlige telegrambytes inklusive BCC byten, skal der være et lige (even) antal 1-taller i bit 1. I samtlige telegrambytes inklusive BCC byten, skal der være et lige (even) antal 1-taller i bit 2. etc...
Lige præcis dette opnås med XOR således som jeg har vist i programmet (jeg har vist C-kode, da VB er ikke specielt velegnet til regning med binære data som det er nødvendigt her).
Hvis nu det viser sig, at pariteten skal være ulige i stedet for lige, skal man starte med en bcc-værdi på 0xFF (altså 8 1-bit).
Det ser fornuftigt ud.. Jeg har hardwaren på Tirsdag, så hvis det dur, og der ikke er nogen der kan finde ISO 1155 uden at det koster $, får du pointene.
Jeg kom til at tænke på, at du måske var interesseret i de udskrifter, mit program laver (det lød som om du måske ikke lige havde nemt ved at køre C-programmer)? De kommer her:
Det var den rigtige udregning, og simpel at udføre i en microprocessor.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.