Forum: PC-Programmierung 24bit int -> char


von Jens H. (Gast)


Lesenswert?

Hallo Community,

vorweg: Ich habe nicht sonderlich viel Ahnung vom C-Programmieren.

Grundlegendes Ziel: Den Wert eines
1
long int
(eigentlich nur 24 Bit) als Decimalzahl über UART auszugeben. Dazu 
verwende ich bisher die Funktion
1
sprintf ()
. Allerdings scheint es mir so dass ich damit nur 16 Bit verarbeiten 
kann. Denn sobald der Dezimalwert 65535 überschritten wird, fängt er 
wieder bei 0 an.

Weiß jemand wie ich das Problem lösen kann? Gibt es Argumente oder 
Funktionen mit denen ich das einstellen kann?

Ich verwende Code Composer Studio 5 für einen MSP430.

Mein bisheriger Test-Code:
1
testwert = 0xfffa;     
2
sprintf( Buffer, "%d", testwert );
3
while (Buffer[i] != 0)      // Ausgabe ueber UART
4
{
5
    while (!(IFG2 & UCA0TXIFG));
6
    UCA0TXBUF = Buffer[i];
7
    i++;
8
}
9
testwert++;
Ich habe auch schon "%ld" versucht doch das bringt auch keinen 
Fortschritt.

Vielen Dank schonmal, lg

von Mighty (Gast)


Lesenswert?

Wandel die Zahl in eine String um und gib sie dann über UART aus.

von g457 (Gast)


Lesenswert?

> sprintf( Buffer, "%d", testwert );
                     ^
ld. Details stehen in der Doku.

HTH

von Jens H. (Gast)


Lesenswert?

g457 schrieb:
> ld. Details stehen in der Doku.

Ich weiß nicht welche Doku du meinst. Aber wie gesagt, "%ld" bringt mir 
nur dass er mir 'ld' ausgibt.

Mighty schrieb:
> Wandel die Zahl in eine String um und gib sie dann über UART aus.

Ich werd mal probieren ob ich das hinkriege.

Falls es übrigens noch von Bedeutung ist, habe folgende Deklarationen:
1
 char Buffer 
2
long int testwert

von g457 (Gast)


Lesenswert?

> Ich weiß nicht welche Doku du meinst.

Die Doku-mentation halt, hier die von sprintf. 'l' wie 'long'.

> char Buffer

∗hust∗ mach da mal einen Puffer draus, der größer ist als wie nur ein 
char.

von Jens H. (Gast)


Lesenswert?

g457 schrieb:
> ∗hust∗ mach da mal einen Puffer draus, der größer ist als wie nur ein
> char.

Sorry, mein Fehler. Habs natürlich als char Buffer[10]; deklariert.

von Jens H. (Gast)


Lesenswert?

Habe nach sehr langem rumgooglen und ausprobieren nun einen Workaround 
gefunden der vorerst zu funktionieren scheint. Habe eine Funktion aus 
einem anderen Forenbeitrag übernommen. Falls es jemanden interessiert:
1
int m = 10;
2
Buffer[m] = '\0';
3
while(--m >= 0)
4
{
5
Buffer[m] = '0' + spannung % 10;
6
spannung /= 10;
7
}

Trotzdem danke für eure Bemühungen!

lg

von Klaus W. (mfgkw)


Lesenswert?

Jens H. schrieb:
> Sorry, mein Fehler. Habs natürlich als char Buffer[10]; deklariert.

dann ist das aber keine gute Idee:

Jens H. schrieb:
> int m = 10;
> Buffer[m] = '\0';

Wie wäre es, mal die Grundlagen von C zu lernen?

Ohne Häme, nur eine ernsthafte Empfehlung.

von Rolf M. (rmagnus)


Lesenswert?

Jens H. schrieb:
> Ich verwende Code Composer Studio 5 für einen MSP430.

Das ist aber kein PC.

Jens H. schrieb:
> g457 schrieb:
>> ld. Details stehen in der Doku.
>
> Ich weiß nicht welche Doku du meinst. Aber wie gesagt, "%ld" bringt mir
> nur dass er mir 'ld' ausgibt.

Dann ist da wohl ein Fehler in der Implementation der 
Standardbibliothek, oder nicht alle Format-Spezifizierer werden 
unterstützt. %ld ist eigentlich der richtige.

von W.S. (Gast)


Lesenswert?

sowas wie sprintf finde ich für Mikrocontroller Mist.

Grund: Man schleppt viel zu viel unbenutztes Zeug in den zumeist knappen 
ROM hinein.

Meine Alternative, die für alles was nicht float ist wohl ausreichen 
dürfte:

/***************************************************
   Dezimal-Konvertierung Long in Pufferbereich.
   digits = gewünschte Anzahl Stellen.
            digits<0 = mit führenden Nullen,
      sonst    = mit führenden Leerzeichen
   Buffer = Zeiger auf den Ergebnispuffer, mindestens 4 Byte groß.
   BufLen = Gesamtgröße des Ergebnispuffers. Soll mindestens 3 Byte 
größer
            sein als digits
 ***************************************************/

long LONGtoString (long aValue, int digits, char* Buffer, int BufLen)
{ char* P;
  char* Q;
  long  L;
  char  v;
  int   i, j, k;
  ldiv_t T;

  *Buffer = 0;
  if (BufLen<4) return aValue;

  i = BufLen - 1;
  j = digits;
  if (j<0) j = -j;

  if (i < (j+3))      /* mehr Stellen als Bufferplatz */
  { Buffer[0] = '?';
    Buffer[1] = 0;
    return aValue;
  }

  Buffer[i--] = 0;    /* Endemarker setzen */
  if (aValue<0)
       { L = -aValue;
         v = 1;
       }
  else { L = aValue;
         v = 0;
       }

  if (!L)  Buffer[i--] = '0';
  while (i)
  { if (!L) goto _lready;
    T = ldiv(L,10);
    L = T.quot;
    Buffer[i--] = '0'+T.rem;
  }

                     /* i = 0, d.h. der Buffer ist voll! */
  i = 0; j = BufLen - 2;
  Buffer[i++] = '>';
  while (i<j) Buffer[i++] = '9';
  return aValue;


/* So, die Ziffern sind erzeugt, jetzt wird formatiert.
   i zeigt auf freien Platz vor 1. Ziffer
 */

_lready:
  k = BufLen - i - 2;       /* k = Anzahl gehabter Digits */

  if (digits < 0)           /* mit Nullen auffüllen */
  { j = -digits;            /* j = Sollstellenzahl */
    if (v) k++;             /* eine Stelle für '-' berücksichtigen */
    while (k++ < j)
    { if (i > 0) Buffer[i--] = '0'; }

    if (v) Buffer[i--]= '-'; /* Vorzeichen eintragen */
  }

  else                      /* mit Spaces auffüllen */
  { if (v)
     { Buffer[i--] = '-';   /* Vorzeichen eintragen */
       k++;                 /* Stelle berücksichtigen */
     }
     j = digits;
     while (k++ < j)
     { if (i > 0) Buffer[i--] = ' '; }
  }
  ++i;                 /* i zeigt jetzt auf 1. Zeichen */
  if (i)
  { P = Buffer;
    Q = &Buffer[i];
    j = BufLen - 1;
    while (j--) *P++ = *Q++;
    *P = 0;
  }
  return aValue;
}


W.S.

von Jens H. (Gast)


Lesenswert?

Deine Alternative funktioniert einwandfrei. Vielen Dank, das hat mir 
wirklich weitergeholfen.

lg

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.