mikrocontroller.net

Forum: Compiler & IDEs printf_Problem


Autor: C-Kämpfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich bastle gerade an meiner Funkuhr und möchte folgenden String über die 
serielle Schnitstelle schicken:

<STX>D:tt.mm.jj;T:w;U:hh.mm.ss<ETX>

Ich habe folgendes Printf-Statement:
    printf("\x02D:%d.%d.%d;T:?;U:%d.%d.%d\x03",day,mon,year,hh,mm,ss);

mein problem ist nun dass am Anfang ein - kommt es soll aber

 <STX>D:24.02.2007;T:?;U:20.16.58<ETX>
kommen

1. Problem warum kommt kein <STX>D am Anfang?
2. Problem  die Ziffern sollen immer 2 stellig ausgegeben werden, falls 
1 stellig sool ne führende 0 ausgegeben werden
   Frage hierzu: Kann man das mit nem Formatstring machen? Oder nur mit 
Programmlogik?

 Kann mir BITTE jemand weiterhelfen, ich bin schon am verzweifeln....

 MfG
 Achim

Terminal Trace.....

2D   -       Mein Problem
3A   :
32   2
34   4
2E   .
32   2       Mein Problem
2E   .
32   2
30   0
30   0
37   7
3B   ;
54   T
3A   :
3F   ?
3B   ;
55   U
3A   :
32   2
30   0
2E   .
31   1
36   6
2E   .
35   5
38   8
03  <ETX>

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu dem Fehler kann ich nichts sagen, aber 2 stellig geht so:
%02d
0: mit 0er Auffüllen
2: 2 Stellen

Autor: C-Kämpfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

@Benedikt Vielen Dank, Punkt 2 ist erledigt (wer lesen kann ist klar im 
Vorteil RTFM)

Problem 1 bleibt.....

Falls ich printf("\x02 
D:%d.%d.%d;T:?;U:%d.%d.%d\x03",day,mon,year,hh,mm,ss);

also zwischen \02 und D ein ' ' "einschiebe kommt es fast so raus wie 
ich möchte, aber eben ein BLANK  welches ich nicht haben möchte....

also <STX> D ich möchte aber <STX>D

Kann mir noch jemand helfen?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar, ist ganz einfach: \x02D ergibt das Zeichen 0x002D.  Da du nur
8-bit-Zeichen benutzt, wird es auf 0x2D (ASCII Minus) eingekürzt.

ANSI C89 (alias ISO C90) hat dafür den Trick eingeführt, dass zwei
unmittelbar aufeinander folgende string literals zu einem einzigen
verkettet werden, du schreibst also
"\x02" "D..."

Wenn du das noch etwas schicker machen willst, nimmst du
#define STX "\x02"

...
printf(STX "D...", ...);

Autor: C-Kämpfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

@Jörg, herzlichen Dank! Du hast den Abend gerettet! Wie kann man das aus 
dem Manuals rauslesen.....
Ich hatte ne Quelle da stand \xnn wobei nn Hexziffern sind. Ich dachte 
das sind 2 Hexziffern. Was wäre dann \x123456789ABCDEF  bei byte nur das 
EF... kann der HEX String beliebig lang sein und wird abhängig vom 
Datentyp von hinten interpretiert.....


Danke
Achim

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, der Hexstring kann beliebig lang sein, er wird erst durch das
erste nicht-hex-Zeichen beendet.

Im Gegensatz dazu wird eine Oktalfolge \NNN durch wahlweise das
erste nicht-oktal-Zeichen oder das vierte Zeichen nach dem
Backslash beendet.

Sollte aber im K&R eindeutig beschrieben sein, im Standard steht
es auf jeden Fall eindeutig.

Autor: C-Kämpfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-----DANKE------
Achim

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.