Integer in char array über UART senden

Gast #367717
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
Gast #367718
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.
Gast #367720
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.
Gast #367721
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?
Gast #367724
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.
Gast #367727
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
Gast #367728
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).
Gast #367729
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren