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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.