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


von Matthias (Gast)


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

von Philipp Karbach (Gast)


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.

von Matthias (Gast)


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

von Philipp Karbach (Gast)


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.

von Matthias (Gast)


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?

von johnny.m (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


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.

von johnny.m (Gast)


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.

von johnny.m (Gast)


Lesenswert?

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

von Matthias (Gast)


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

von johnny.m (Gast)


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).

von johnny.m (Gast)


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!

von Matthias (Gast)


Lesenswert?

Voll ins Schwarze getroffen!

Genau daran lags. Jetzt läuft das Programm.

Vielen Dank an alle!
Gruß Matthias

von Matthias (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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

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.