www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RS232 Zahlen an 8051 senden


Autor: M. D. (derdiek)
Datum:

Bewertung
0 lesenswert
nicht 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
FILE* ausdatei
 Variable erzeugt habe, diese dann mit
ausdatei = fopen(com3:,"w"); 
einstelle, und dann mit
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
>
FILE* ausdatei
 Variable erzeugt habe, diese dann mit
>
> ausdatei = fopen(com3:,"w"); 
> einstelle, und dann mit
>
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.

Autor: M. D. (derdiek)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.