Forum: Compiler & IDEs Funktion utoa funktioniert nicht richtig


von R. B. (britzi)


Lesenswert?

Hallo zusammen,

ich habe ein kleines Problem mit der Funktion utoa.

Ziel ist es einen Integer aus dem ADC in einen String für UART-Ausgabe 
zu schreiben.

Ich habe schon einiges probiert um den Fehler zu finden, aber bin 
mittlerweile völlig Ratlos.

Der Code sieht wie folgt aus:
1
int main(void)
2
{
3
  
4
  uint16_t adc_wert=50;
5
  char spannung[20];
6
  uint16_t acd_flag=1;
7
  init_uart();
8
        
9
   sei();
10
   
11
    while(1)
12
    {
13
    
14
    if (adc_wert!=acd_flag)
15
       {utoa(adc_wert, spannung, 10);
16
       strcpy(spannung, "\n\r");
17
       //put_string(spannung);
18
       put_string("test\n\r");
19
       adc_wert=acd_flag;
20
      }
21
    
22
    
23
     }

So wie gezeigt gibt Uart korrekt einmal "test" aus.
Wenn ich die Zeile mit dem erzeugten String auskommentiere liefert die 
Ausgabe ausschließlich die Zeichenfolge 0A 0D 0A 0D und auch das Wort 
"test" wird nicht mehr ausgegeben.

Sieht jemand den Fehler?

Vielen Dank :-)

von Rolf Magnus (Gast)


Lesenswert?

R. B. schrieb:
> Sieht jemand den Fehler?

R. B. schrieb:
> strcpy(spannung, "\n\r");

Hier ersetzt du das, was du vorher reingeschrieben hast, durch ein 
Newline.

von Helfer (Gast)


Lesenswert?

R. B. schrieb:
> strcpy(spannung, "\n\r");

Mit diesem Ausdruck überschreibst du die vorher durch utoa() erzeugten 
Daten aus deinem String.
0A und 0D sind die Hexadezimalen Darstellungen deiner Zeichen '\n' und 
'\r' Lasse diese Zeile weg, oder ersetze sie durch:
strcat (spannung,"\n\r");

von Helfer (Gast)


Lesenswert?

Ups, da waren Rolfs finger wohl flinker ;)

von Non-Softi (Gast)


Lesenswert?

>        strcpy(spannung, "\n\r");

Tach, werden die hier nicht die ersten beiden Bytes des Strings, der die 
Spannung enthalten soll, wieder mit CR-LF überschrieben?

Gute Nacht, im Zweifel versuch's morgen früh nochmal.

von Chris L. (kingkernel)


Lesenswert?

Die Funktion die du suchst, lautet strcat. strcat hängt einen string an 
einen bestehenden an

von Kaj (Gast)


Lesenswert?

Alternative:
Du weißt ja wie groß dein Wert ist, dann kannst du das im zweifel auch 
von hand machen, z.B.: Spannung[5] = '\n'; Spannung[6] = '\r';

Grüße

von Karl H. (kbuchegg)


Lesenswert?

Kaj schrieb:
> Alternative:
> Du weißt ja wie groß dein Wert ist, dann kannst du das im zweifel auch
> von hand machen, z.B.: Spannung[5] = '\n'; Spannung[6] = '\r';



Das ist die schlechteste Idee, die du haben kannst.

Alternativ:
Du kannst auch deine Texte in mehreren Happen ausgeben. Der Empfänger 
kann das sowieso nicht unterscheiden, ob du einmal oder mehrmals 
put_string aufgerufen hast. Der sieht ja nur, was an Zeichen über seine 
Schnittstelle reinkommt.
1
       utoa( adc_wert, spannung, 10 );
2
       put_string( spannung );
3
       put_string( "\r\n" );

von R. B. (britzi)


Lesenswert?

Vielen Dank für die Antworten. :-)

Das Problem hat sich sofort gelöst ;-)

Ihr seit echt super!

von Axel S. (a-za-z0-9)


Lesenswert?

Und weil Karl Heinz es zwar korrigiert, aber nicht erwähnt hat: die 
korrekte Zeilenende-Sequenz für (Win)DOS Systeme ist CR + LF (als C 
Literal: "\r\n") und nicht umgekehrt.


XL

von R. B. (britzi)


Lesenswert?

Axel Schwenke schrieb:
> Und weil Karl Heinz es zwar korrigiert, aber nicht erwähnt hat: die
> korrekte Zeilenende-Sequenz für (Win)DOS Systeme ist CR + LF (als C
> Literal: "\r\n") und nicht umgekehrt.


Danke :-)

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.