Forum: PC-Programmierung Checksumme Modulo 256 bilden in C# Klimaschrank


von Michael (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche mit einem Klimaschrank über RS232 zu kommunizieren.
An sich wollte ich das "gerade" per Terminal von Hand eingeben, aber 
dann sagt die Anleitung, dass ich eine Prüfsumme an jeden String 
anhängen soll.

Ich habe daraufhin Visual Studio runtergeladen und versucht diese 
Prüfsumme aus einem String mit C# zu ermitteln. Leider ohne Erfolg. Ich 
verstehe die Prüfsummenbildung nicht. Auf Seite 100 bis 106, siehe PDF 
im Anhang ist es an sich erklärt, aber verstehen tue ich den Quellcode 
vom Turbopascal nicht.

Ich habe es probiert die Summe der einzelnen ASCII Zeichen zu bilden und 
dann anschließend mit dem Modulo Operator den Rest der Modulo 256 
Operation als Checksumme zu nehmen.
1
        static void Main(string[] args)
2
        {
3
            Console.WriteLine("Klimschrank String eingeben:");
4
            //string input = Console.ReadLine();
5
            //const string input = "1T018.5F65POT015.7#11T010.0F90R1000000000000000";
6
            const string input = "1?";
7
            Console.WriteLine(input);
8
            Console.WriteLine("Modulo 256 Checksum:");
9
            // Invoke GetBytes method.
10
            // ... You can store this array as a field!
11
            byte[] array = System.Text.Encoding.ASCII.GetBytes(input); //Die Asciizeichen sind jetzt als Dezimalwert drin Tabelle ASCII => Dezimalzahl
12
            int summe = 0x02; // Start für STR
13
            // Loop through contents of the array.
14
            foreach (byte element in array)
15
            {
16
               summe += element;
17
                Console.WriteLine(element);
18
            }
19
            Console.WriteLine(summe);
20
            int checksum = summe % 256;
21
            Console.WriteLine(checksum);
22
           Console.WriteLine("{0:X02}", checksum);
23
        }

Für den String STR 1? erhalt ich als Prüfsumme 0x72. Soll lt. Anleitung 
0x8E.

Für den String STR 1T018.5F65POT015.7#11T010.0F90R1000000000000000 
erhalte ich 0xEC. Soll lt. Anleitung 0x14.

Kann mir hier wer weiterhelfen?

Ich möchte an sich nur ein paar Parameter an den Klimaschrank sende :/

Gruß
Michael

von leo (Gast)


Lesenswert?

Michael schrieb:
> Für den String STR 1? erhalt ich als Prüfsumme 0x72. Soll lt. Anleitung
> 0x8E.

Passt ja (fast). Du hast Komplement im .PDF nicht gelesen 
(0x72+0x8E=0x100).

leo

von c-hater (Gast)


Lesenswert?

Michael schrieb:

>             int checksum = summe % 256;

Ersetzen durch:

byte checksum = Convert.ToByte((~summe + 1) & 0xff);

von Oliver S. (oliverso)


Lesenswert?

Michael schrieb:
> verstehe die Prüfsummenbildung nicht. Auf Seite 100 bis 106, siehe PDF
> im Anhang ist es an sich erklärt, aber verstehen tue ich den Quellcode
> vom Turbopascal nicht.

https://www.heise.de/download/product/free-pascal-2271

Oliver

von WIRO (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Michael,
ich habe das Programm abgetippt und mit dcc kompiliert (s. Anlage).
Zuerst wird der String abgefragt, dann wird die Prüfsumme angezeigt.

Gruß
WIRO

von Michael (Gast)


Lesenswert?

Vielen Dank euch allen für die tolle und schnelle Hilfe.
Nun funktioniert es.

Danke!

von Eddi R. (Gast)


Lesenswert?

Hallo,
ich stehe grade vor dem gleichen Problem. Möchte aber den Code in 
Arduino benutzen. Der Anhang von dem Programm in dem die Prüfsumme 
gebildet wird, lässt sich bei mir nicht öffnen. Könnte mir jemand sagen, 
wie ich die Prüfsumme berechnen lassen kann?

Gruß

Eddi

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Eddi R. schrieb:
> Hallo,
> ich stehe grade vor dem gleichen Problem. Möchte aber den Code in
> Arduino benutzen. Der Anhang von dem Programm in dem die Prüfsumme
> gebildet wird, lässt sich bei mir nicht öffnen. Könnte mir jemand sagen,
> wie ich die Prüfsumme berechnen lassen kann?
>
> Gruß
>
> Eddi

Ohne jetzt noch höhere Hirnfunktionen zu benutzen, einfach aus dem 
Rückenmark:
1
#include <string.h>
2
#include <stdint.h>
3
4
uint8_t pruefsumme(char string[]) {
5
 int i;
6
 uint8_t summe = 0x01;
7
  
8
 for (i = 0; i < strlen(string); i++) {
9
  summe += string[i];
10
 }
11
  
12
 return ~summe;
13
}

EDIT: Achja die Umwandlung in HEX (ohne Hex Formatspezifizierer):
1
 uint8_t B = pruefsumme(teststring);
2
3
 char j = B / 16;
4
 char k = B - 16 * j;
5
 if (j < 10) j+='0';
6
 else j+='A'-10;
7
 if (k < 10) k+='0';
8
 else k+='A'-10;
9
  
10
 printf("0x%c%c", j, k);

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.