Avatar billede vovsen Nybegynder
22. november 2002 - 16:38 Der 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.

Hvordan regnes denne ?
Avatar billede vovsen Nybegynder
22. november 2002 - 16:47 #1
Jeg kan godt finde den hos ISO, men de skal have en mindre bondegård for en enkelt side.
Avatar billede jespernaur Nybegynder
22. november 2002 - 17:31 #2
Det telegram du har vist, er det hexadecimale bytes?

Har du mulighed for at vise et telegram, der allerede indeholder en korrekt udregnet checksum?
Avatar billede jespernaur Nybegynder
22. november 2002 - 17:34 #3
Evt et par forskellige eksempler på telegrammer
Avatar billede vovsen Nybegynder
22. november 2002 - 17:35 #4
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.
Avatar billede jespernaur Nybegynder
22. november 2002 - 17:40 #5
Det skal gøres med 'exclusive or', vent lige lidt, måske 20 min,  så vender jeg tilbage med en løsning i C
Avatar billede jespernaur Nybegynder
22. november 2002 - 18:00 #6
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;
}

void main(void)
{
  unsigned char buf1[] = { 1,65,2,65,31,66,67,68,30 };

  unsigned char bcc;

  bcc = CalculateBCC( buf1, sizeof(buf1) );
  printf("bcc buf1 = %d\n", bcc);
}
Avatar billede vovsen Nybegynder
22. november 2002 - 18:24 #7
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 ?
Avatar billede vovsen Nybegynder
22. november 2002 - 18:34 #8
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.
Avatar billede jespernaur Nybegynder
22. november 2002 - 19:35 #9
Efter det du har oplyst, skal der gælde:

BCC skal beregnes således at:

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).

Mvh
Jesper Naur
Avatar billede vovsen Nybegynder
22. november 2002 - 19:47 #10
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.
Avatar billede jespernaur Nybegynder
23. november 2002 - 10:01 #11
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:

buf 01 41 02 41 1F 42 43 44 1E bcc 47
bcc buf1 = 71

Med andre ord: bcc for dit eksempeltelegram = 47(hexadecimalt) = 71(decimalt)
Avatar billede vovsen Nybegynder
28. november 2002 - 13:46 #12
Det var den rigtige udregning, og simpel at udføre i en microprocessor.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester