Forum: Mikrocontroller und Digitale Elektronik RS232 Zahlen an 8051 senden


von M. D. (derdiek)


Lesenswert?

Hallo.

Ich will mit einem Windows-PC in einem C-Programm berechnete Zahlen an 
einen 8051 senden, dieser soll die Daten verarbeiten und an Port1 an 
einer LED-Platine mit 8 LED´s (1 2 4 8 16 32 64 128) ausgeben.

Das C-Programm auf dem Rechner berechnet eine Zahlenfolge:
1 2 4 8 16 32 64 128

Jede dieser Zahlen wird mit 500ms Verzögerung gesendet.
Der Mikrocontroller gibt die Zahlen 1-8 richtig aus, ab der 16 wird 
jedoch nur noch die letzte Ziffer ausgegeben.
Das Ergebnis an den LED´s:
1 2 4 8 6 2 4 8
16 + 32 leuchten dabei ständig.
Das lässt mich darauf schließen das irgendwo die Zahlen in Ascii 
umgewandelt werden, da diese ab 48 mit der 0 beginnen.

Ich sende vom PC aus, indem ich eine
1
FILE* ausdatei
 Variable erzeugt habe, diese dann mit
1
ausdatei = fopen(com3:,"w");
einstelle, und dann mit
1
fprintf(ausdatei,"%i", x);
ausgebe.
x ist eine int-Variable.

Sobald ich das %i im fprintf gegen %c austausche funktioniert der 
Datenempfang richtig, d.h. auch die LED´s, die die 32er, 64er und 128er 
Stelle anzeigen sollen leuchten dann korrekt.

So, nun meine Frage. Wieso ist das so?

Ich weiß nicht ob die Frage schon gestellt wurde, habe so zumindest auf 
die Schnelle nichts über die Suche bzw google gefunden was meine Frage 
beantwortet.

von Karl H. (kbuchegg)


Lesenswert?

M. D. schrieb:

> Das lässt mich darauf schließen das irgendwo die Zahlen in Ascii
> umgewandelt werden, da diese ab 48 mit der 0 beginnen.
>
> Ich sende vom PC aus, indem ich eine
>
1
FILE* ausdatei
 Variable erzeugt habe, diese dann mit
>
1
> ausdatei = fopen(com3:,"w");
> einstelle, und dann mit
>
1
fprintf(ausdatei,"%i", x);
> ausgebe.


Ja, da wird tatsächlich ein Text, der die Zahl darstellt übertragen.
Für die Zahl 32, wird der Text "32" generiert, also die Zeichen '3' und 
'2' und die nacheinander im File gespeichert, bei dir eben über die 
serielle Schnittstelle übertragen.

Das ist genau das was alle printf-Funktionen, sei es printf, sprintf, 
fprintf machen.

> Sobald ich das %i im fprintf gegen %c austausche funktioniert der
> Datenempfang richtig, d.h. auch die LED´s, die die 32er, 64er und 128er
> Stelle anzeigen sollen leuchten dann korrekt.
>
> So, nun meine Frage. Wieso ist das so?

Weil bei %c das printf davon ausgeht, dass im übergebenen Argument, bei 
dir x, schon der ASCII Code enthalten ist. Oder in C-Speak, da wird 
bereits ein Zeichen übergeben. Daher muss man nicht erst aus einer Zahl 
eine Zeichenfolge machen.


   printf( "%i",  65 );

%i sagt, dass das Argument (65) eine Zahl ist und diese in lesbarer Form 
ausgegeben werden soll. Also wird daraus der Text "64" generiert und 
dieser ausgegeben. Zum Ausgabegerät werden die ASCII Codes 54 und 53 
geschickt. Als Folge davon: Auf deinem Monitor steht lesbar: 65

   printf( "%c", 65 );

%c sagt, dass das Argument (65) bereits ein Zeichen ist. Da muss nichts 
konvertiert werden. Die 65 werden als Code zum Ausgabegerät geschickt, 
welcehs für einen ASCII Code von 65 ein 'A' anzeigt.

von M. D. (derdiek)


Lesenswert?

Ahh, super! Danke für die Top-Erklärung :D

Das hab ich nicht gewusst das die Zeichen bei %i einzeln abgespeichert 
werden. Dachte die gesamte Zahl wird in Binär gewandelt und übertragen.

Immer wieder toll das Forum :)

von Karl H. (kbuchegg)


Lesenswert?

M. D. schrieb:
> Ahh, super! Danke für die Top-Erklärung :D
>
> Das hab ich nicht gewusst das die Zeichen bei %i einzeln abgespeichert
> werden. Dachte die gesamte Zahl wird in Binär gewandelt und übertragen.


%c ist die einzige Ausnahme.
Da wird das Zeichen so wie es ist, übertragen.
Bei allen andern Formatierzeichen wird immer eine textuelle 
Repräsentierung generiert. Egal ob das %d, %i, %ld, %x, %f oder was auch 
immer ist.

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.