www.mikrocontroller.net

Forum: Compiler & IDEs Integer in char array über UART senden


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Ich möchte über den UART  einen String versenden:
    V.aaaa.bb
aa ist hier eine Drehzahl als Integerwert.

Meine Grundidee war, den Integerwert mit itoa in char zu wandeln und
dann in einen großen String, der auch die Formatzeichen enthält,
einzubauen. Das schient auch ganz gut zu funktionieren.

Meine Frage: Kann ich meine in char gewandelte Drehzahl einfacher in
den großen String basteln?

Hier ein Beispiel was ich vorhabe:

String[10]   // String der übermittelt wird
aaaa[4]      // String der meine Drehzahl enthält

String[0] = 'V';
String[1] = ',';
String[2] = aaaa[0];
String[3] = aaaa[1];

String[4] = aaaa[2];
String[5] = aaaa[3];
String[6] = ',';
String[7] = bbbb[0]

 und so weiter...

Das artet aber bei sehr großen Strings in eine rießige Schreibarbeit
aus. kann ich das irgendwie einfacher machen???

Danke schon mal

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum machst du das nicht gleich so?
char buffer[128] //oder wie groß auch immer

sprintf(buffer,"V,%d.%d\n",drehzahl,kuddelmuddel);

printf(buffer);

so macht man sowas in C normalerweise. klar kannst du das so wie du
machen, spart speicher etc. aber es ist ein bißchen gurkig.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist natürlich besser.

Das heißt sprintf formatiert mir auch gleich meinen Integerwert!?, so
dass ich mir auch noch itoa spare.

Der String wird dann in buffer gespeichert

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genauso funktioniert das. außerdem hängt er auch noch \0 an die strings
und so, ist sehr praktisch eigentlich. aber wie gesagt wenn du speicher
sparen willst solltest du vielleicht drauf verzichten.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bis jetzt sind ncoh 50k frei, ist zwar noch nicht alles implementiert
aber das dürfte reichen.
Spare ich mir viel Speicher wenn ich es wie ich gedacht hatte löse?

Und noch eine Frage hätte ich:
Wenn ich das wie oben implementiere, bekomme ich eine Warnung dass ich
es implizit deklarieren würde

 warning: implicit declaration of function `sprintf'

kann ich dies getrost übersehen? Bzw was willer mir damit sagen?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er will Dir damit vermutlich sagen, dass Du vermutlich die Header-Datei
<stdio.h> nicht #included hast und er die Funktion nicht kennt.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, daran liegt es nciht. Das Problem taucht acuh auf, wenn ich eigens
geschriebene Funktionen aufrufe

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also hast du bei deinen Funktionen auch den Header, in dem sie
deklariert sind, im aufrufenden File eingebunden? Kannst du mal ein
Beispiel posten? So wie du es beschreibst, dürfte diese Meldung nicht
kommen.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, und zwar dann, wenn der Compiler die Funktion zum Zeitpunkt ihres
ersten Aufrufes noch nicht kennt. Und wenn die <stdio.h> nicht
eingefügt wurde, dann kennt er sie nunmal nicht.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hach, Mist, Überschneidung. Mein Posting von 15:28 bezieht sich
natürlich auf Matthias' Posting von 15:23...

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...
String[0] = 's';
String[1] = ',';
String[2] = Status[0];
String[3] = Status[1];

Senden(String);

...
void Senden(char *s)
{
    while (*s)
    {   uart_putc(*s);
        s++;
    }
}

int uart_putc(unsigned char c)
{
    while (!(UCSR0A & (1<<UDRE0))); /* warten bis Senden moeglich */
    UDR0 = c;                      /* sende Zeichen */
    return 0;
}

ICh bekomme hier eine Fehlermeldung, dass ich wo ich Senden(String)
aufrufe, die Funktion schon implizit deklariert habe und bei uart_putc
sagt er nur implizite Deklarierung von uart_putc

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du dem Compiler nicht vor dem ersten Aufruf einer Funktion (in
diesem Fall uart_putc()) bekannt gibst, dass diese Funktion existiert,
dann kann er sie nicht kennen! Eine Funktion muss vor ihrem ersten
Aufruf deklariert (nicht definiert!) werden, d.h. Du musst entweder die
Funktions-*Definition* (das was Du unten stehen hast) vor 'void
Senden(char*s){}' verschieben oder Du schreibst an den Anfang des
Programms einen Funktionsprototyp 'void Senden(char*s);' (das wäre
dann die Deklaration).

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zur Verdeutlichung:

/*Funktionsprototypen (geben dem Compiler bekannt, dass irgendwo im
Programm Funktionen mit diesen Eigenschaften definiert sind):*/

void Senden(char *);
int uart_putc(unsigned char);

...
String[0] = 's';
String[1] = ',';
String[2] = Status[0];
String[3] = Status[1];

Senden(String);

...
void Senden(char *s)
{
    while (*s)
    {   uart_putc(*s);
        s++;
    }
}

int uart_putc(unsigned char c)
{
    while (!(UCSR0A & (1<<UDRE0))); /* warten bis Senden moeglich */
    UDR0 = c;                      /* sende Zeichen */
    return 0;
}

So müsste es (zumindest was diesen Ausschnitt angeht) ohne
Fehlermeldungen in Bezug auf 'implicit declaration' abgehen. Das
selbe gilt für die Header-Dateien: sie müssen am Anfang eingefügt
werden, zumindest vor dem ersten Aufruf einer Komponente daraus!

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Voll ins Schwarze getroffen!

Genau daran lags. Jetzt läuft das Programm.

Vielen Dank an alle!
Gruß Matthias

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab doch noch mal ne Frage, warum kommt die Warnung auch bei itoa,
muss ich dafür auch noch was bestimmtes deklarieren?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
itoa und artverwandte Funktionen befinden sich afaik in der stdlib.h.
Die müsstest Du natürlich dann auch #includen

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, ja genau. Daran liegt es.
Vielmals noch mal D A N K E
Gruß

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.