Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

Hilfe mit C-Programm

Nobody666 / 12 Antworten / Flachansicht Nickles

Hallo,


hab hier anbei ein C-Programm. Es sollte am Ende so etwas wie S3 0A 00 00 00 4B 31 00 04 10 01 9B herauskommen(ohne Blanks). S3 ist hier fest, 09 sollte die anzahl der nachfolgenden Bytes sein, dann kommmen eine 4 Byte lange hexZahl, anschließend eine 5 Byte lange hexZahl und das letzte Byte sollte die Summe der Zahlen ab S3 sein.


Kann mir bitte jemand erklären, wie das ganze funktioniert, da ich es ein wenig umschreiben muß???


Danke


 


void OutputMotorolaFormat(FILE *fp, unsigned long addr, char *buffer, unsigned nbytes)
{
   unsigned i, j, bytecount, sumcheck;
   char c, *ptr = buffer;
   unsigned long localaddress = addr;


   for (i = 0; i < nbytes; i += 16) {
      bytecount = nbytes - i;
      if (bytecount > 16) bytecount = 16;
      fprintf(fp, "S3%02X%08lX", bytecount + 5, localaddress);
      sumcheck = bytecount + 5;
      for (j = 0; j < 3; j++)
         sumcheck += (localaddress >> (8 * j)) & 0xFF;
      for (j = 0; j < bytecount; j++) {
         fprintf(fp, "%02X", (int)(c = *ptr++));
         sumcheck += c;
      }
      fprintf(fp, "%02X\n", ~sumcheck & 0xFF);
      localaddress += bytecount;
   }
}

bei Antwort benachrichtigen
mr.escape Nobody666 „Hi, da hast du Recht, das Problem liegt beim Aufspalten. Eigentlich sollte...“
Optionen
Eigentlich sollte sscanf seine Suche beim erneuten aufruf unmittelbar nach dem zuletzt umgewandelten Zeichen, jedenfalls steht das überall so.
Und zwar zu recht, aber nur innerhalb eines aufrufes. Z.B.:
sscanf(test,"%2x%2x",&aufspaltung[i],&aufspaltung[i+1]);
Hier werden zwei zwei nibble grosse hex zahlen , beginnend bei test in die variablen aufspaltung[i] und aufspaltung[i+1] gespeichert. Beim nächsten aufruf wird erneut bei test begonnen und die gleichen zwei doppel-nibble zahlen ermittelt.
Die lösung für dieses problem ist (allgemein):
sscanf(test+i*2,"%2x",&aufspaltung[i]);
In diesem spez. fall aber muss noch der uninteressante anfang("S3") übersprungen werden d.h.:
sscanf(test+i*2+2,"%2x",&aufspaltung[i]);
Die zeile:
sscanf(test,"%*2i",&aufspaltung[0]);
kann komplett entfallen (sie macht ja eh nix).

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Hilfe mit C-Programm Nobody666
Hilfe mit C-Programm Andreas42
Hilfe mit C-Programm Nobody666