Autor Beitrag
kkoeniger
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 17.09.08 08:59 
Hallo,

jahrelang durfte ich hier wertvolle Tipps mitlesen und stehe jetzt an. Irgendwie habe ich ein Brett vor den Augen.

Ich muss in einem alten Delphi3-Programm ein Modul für die Datenübermittlung per serieller Schnittstelle an ein neues medizinisches Laborgerät schreiben. Klappt auch soweit mit Senden, Empfangen, Daten aus dBase-Dateien lesen und schreiben. Aber das Gerät verlangt eine Checksum über den zu sendenden String und weist meine Berechnung zurück.

In der Gerätedokumentation steht (leider nur in englischer Sprache):
"CH, CL represents the high nibble (=most significant 4 bit) respectively, the low mibble (=least significant 4 bit) of the 8-bit checksum. CH and CL are represented as two digits of hex numbers. The checksum is the modulus 8 of the sum of ASCII values of ... the string ..."
Als Beispiel steht dabei:
'1Test'+chr(3) ergibt 'D4'

Der folgende Code (CRC8-Berechnung?, fand ich in meiner Codesammlung) ergibt zwar beim obigen Beispiel (zufällig?) das richtige Ergebnis, aber sonst wohl nicht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function TLogoAppForm.StringToHex(s:string) : string;
var
   t : integer;
   sum_hex : integer;
begin
  sum_hex := 0;
  result := '';
  for t := 1 to length(s) do begin
    if t = length(s) then begin
      result := result + IntToHex(ord(s[t]),2);
      sum_hex := sum_hex + ord(s[t]);
      end
    else begin
      result := result + IntToHex(ord(s[t]),2) + '';
      sum_hex := sum_hex + ord(s[t]);
      end
  end;
  result := inttohex(sum_hex mod 256,2);
end;


Irgendwie fehlt mir der Plan zur Lösung - wahrscheinlich bin ich von den restlichen Programmierarbeiten schon zu übermüdet.

lg und Danke im Vorhinein für Eure Hilfe,
Karl

Moderiert von user profile iconmatze: Code- durch Delphi-Tags ersetzt
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mi 17.09.08 09:19 
Von der Beschreibung her hätte ich nun gesagt

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function Checksum(AInput: string): string;
var i: integer;
    Temp: integer;
begin
  Temp := 0;
  for I := 1 to length(AInput) do
  begin
    temp := temp + ord(AInput[i]);
  end;

  temp := temp mod 8;
  result := inttohex(temp, 2);
end;


Da bekomm ich allerdings 04 für das Beispiel, und nicht D4?!
Vielleicht findet jemand den Fehler.

_________________
PROGRAMMER: A device for converting coffee into software.
kkoeniger Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 17.09.08 09:47 
user profile iconXentar hat folgendes geschrieben:
Von der Beschreibung her hätte ich nun gesagt

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function Checksum(AInput: string): string;
var i: integer;
    Temp: integer;
begin
  Temp := 0;
  for I := 1 to length(AInput) do
  begin
    temp := temp + ord(AInput[i]);
  end;

  temp := temp mod 8;
  result := inttohex(temp, 2);
end;


Da bekomm ich allerdings 04 für das Beispiel, und nicht D4?!
Vielleicht findet jemand den Fehler.


Danke schon mal.

Vielleicht fehlt noch die high bzw. low nibble Umrechnung. Beispiel gefunden:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function LowNibble(B: byte): byte;
begin
  Result := B AND $0F;
end;
 
function HighNibble(B: byte): byte;
begin
  Result := B AND $F0;
end;