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