Go Down

Topic: Berechnung der Checksumme und ausgabe (Read 142 times) previous topic - next topic

nomis321

Hey ich hab folgendes Problem

ich habe als Befehl: 49f0
daraus errechne ich die Checksumme [
Dies funtionier indem ich alles in HEX umrechne und mit XOR Zusammenzähle

ich mach das mit folgedem code:
Code: [Select]
char test[]="49f0";
int eingang;
void setup() {
 Serial.begin(9600);


}

void loop() {
if (Serial.available()>0)
{
  eingang=Serial.read();

  if (eingang=='1')
  {
  Serial.print("Ausgabe in HEX: ");
  Serial.print(test[0], HEX);
  Serial.print(test[1], HEX);
  Serial.print(test[2], HEX);
  Serial.println(test[3], HEX);

  char checksumme = test[0] ^ test[1] ^ test[2] ^ test[3];
 

  Serial.print("Ausgabe als String: ");
  Serial.println(test);

 
  Serial.print("Berechnete Checksumme: ");
  Serial.println(checksumme);

 
  Serial.print("Befehl + Checksumme: ");
  Serial.print(test);
  Serial.println(checksumme);
  }
 
}

}


Jetzt ist meine Frage im moment ist das ja nur ein Befehl.
Wie sieht das aus wenn es mehrer und auch mit unterschiedler Länge sind.
kann man das irgendwie kürzer schreiben ohne so viele Serial.print().
Die Befehle sollen dann nacheinander abgearbeitet werden.


uwefed

Du rechnest gar nichts in HEX um. Du gibst die Zahlen nur als Hexwerte auf die serielle Schnittstelle aus.
Der Kontroller rechnet intern binär und alles andere sind nur Darstellungsformen für den Menschen.

Erklähr dein gesamten Projekt.

Grüße Uwe


nomis321

Ich will von meinem Arduino den befehl 49f0 + Checksumme [ als Hexwerte an mien Gerät senden.
Es sollen mehrere Befehle hinzukommen wie z.B 49f1 .... diese sollen dann der Reihe nach abgearbeitet werden.
Alle Befehle sollen als HEX übermittelt werden.

HotSystems

Ich will von meinem Arduino den befehl 49f0 + Checksumme [ als Hexwerte an mien Gerät senden.
Es sollen mehrere Befehle hinzukommen wie z.B 49f1 .... diese sollen dann der Reihe nach abgearbeitet werden.
Alle Befehle sollen als HEX übermittelt werden.
Was meinst du mit "Befehl 49f0" ?
Du solltest dich schon verständlicher ausdrücken.

Dein Sketch braucht Anweisungen und 49f0 ist ein Wert, den du per Anweisung übergibst.
Meinst du das ?
I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)
Gruß Dieter

nomis321

Ja 49f0 ist eine Anweisung diese steht z.B. für Module aus.
Tut mit leid wenn ich mich nicht so gut ausdrücke mach das zum ersten mal.
Diese Anweisung soll dann als HEX an mein Gerät übermittelt werden.
Wenn dieses antwortet soll die nächste Anweisung gesendet werden.

nomis321

Vllt kann mir jemand auch hier weiterhelfen.
ich nutze folgenden Code:
Code: [Select]

char test1[]="49f0";
char test2[]="49f1";
int eingang;
int i;

void setup() {
 Serial.begin(115200);


}


void hex(String test)
{
   for (i = 0; i < sizeof(test) -1; i++)
    {
    Serial.print(test[i], HEX);
    } 
    char checksumme = test[0] ^ test[1] ^ test[2] ^ test[3];
    Serial.print(checksumme, HEX); 
}

void loop() {
if (Serial.available()>0)
{
  eingang=Serial.read();

  if (eingang=='1')
  {
hex(test1);
Serial.print(" ");
hex(test2);


 }}}


Gibt es eine möglichkeit wie ich bei der Berechnung der Checksumme die länge automatisch erkenen kann?
Als das auch längere anweisung funktionieren.
und kann mir jemand sagen warum ich als Ausgabe 3439663005B 3439663105A bekomme.
und nicht 343966305B 343966315A.

uwefed

char test1[]="49f0";
...
char checksumme = test[0] ^ test[1] ^ test[2] ^ test[3];

so machst Du die Checksumme der Ascii-Code der Buchstaben nicht der Zahl.

Was mußt Du genau machen?

Grüße Uwe

Doc_Arduino

Hallo,

übertragen wird immer binär. Du änderst nur immer die Darstellungsform, also die Schreibweise des Wertes! Ob du das nun dezimal oder hexadezimal oder oktal notierst ist dabei Jacke wie Hose. Der Wert selbst ändert sich nicht. Zwischen 0xFF und 255 gibts keinen Unterschied, außer der Schreibweise. An der seriellen Übertragung ändert das auch nichts, für den Wert 0xFF oder 255 wird 8x logisch 1 übertragen. Ob du x auf 255 oder auf 0xFF vergleichst ist wie gesagt Jacke wie Hose. Das muss dir klar werden.

Für die Checksummenberechnung gibts eine fertige Lib. Einfach nutzen. Google nach   avr crc lib

Ich empfehle für die Datenübertragung ein festes Protokoll.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up