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?
Er will Dir damit vermutlich sagen, dass Du vermutlich die Header-Datei <stdio.h> nicht #included hast und er die Funktion nicht kennt.
Nein, daran liegt es nciht. Das Problem taucht acuh auf, wenn ich eigens geschriebene Funktionen aufrufe
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.
Hach, Mist, Überschneidung. Mein Posting von 15:28 bezieht sich natürlich auf Matthias' Posting von 15:23...
... 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!
Voll ins Schwarze getroffen! Genau daran lags. Jetzt läuft das Programm. Vielen Dank an alle! Gruß Matthias
Ich hab doch noch mal ne Frage, warum kommt die Warnung auch bei itoa, muss ich dafür auch noch was bestimmtes deklarieren?
itoa und artverwandte Funktionen befinden sich afaik in der stdlib.h. Die müsstest Du natürlich dann auch #includen
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.