HAllo.Arbeite mit den Atmega16L und habe leider ein kleines Problem. Programiere in c und steuer mit dem Mikrocontroller ein Bluetoothmodul. Befehle kann ich dem Modul (über USART )mitteilen und das fuinzt auch soweit.Die Befehle übertrage ich in Hex Zahlen .Nun möchte ich aber zb. eine Adresse wie zb. 12 34 56 78 9A BC über USART versenden.Und genau da fehlen mir gerade die IDEEN wie ich das sinvoll, und optimiert hinbekomme.Denke da an einen ARRAY oder so.Kenn jemand vielleicht eine Lösung?Also die einzelne Zeichen übertrage ich so: void sende_Bluetooth(unsigned char a) { while (! UCSRA & (1<<UDRE))); UDR =a; }
Stichwort Ringbuffer. AVR-Appnote mit C-Code: AVR306 Für Assembler: AVRFreaks Design Note #029 "Implementing FIFO Buffers in Software" MfG Olaf
Hallo nochmal.Also zb beispiel möchte ich jetzt "Name" über USART senden. meine Sende Funktion steht ja oben.Möchte dann Name byte für byte übertragen.Hoffe das macht dies verständlicher .Thx schon mal
Also verstehe ich das richtig.Das ich das mit eine Array machen soll der dann immer wieder eine stelle (Adresse) nach jedem gesendeten Zeichen weiterrücken soll?Oder nicht?
Moin, such mal nach den UART Routinen von Peter Fleury http://jump.to/fleury, da finde ich ist das ganze sehr anschaulich gelöst. In der Codesammlung sind auch bereits einige brauchbare Beispielcodes. mfg, Bjoern
Hi Bjöern.Also ich verstehe jetzt schon wie es gemacht wird.Habe zuätzlich zu mein Funktion die Funktion SendeString(char *s) geschrieben welche die Zeichen nach Fifo einzelnd übermittel soll.Aber wie soll ich denn zb "Name" im meinen programm definieren und damit dann auch übergeben?also es liegt eher am syntax bei mir .sorry
uart_puts_P("\r\n-= Luefter Test Aplication =-\r\n"); ============ Nocheinmal Fleury UART diese Funktion untersuchen...... Ich fange auch erst mit C an und kann ein bischen Delphi und Basic, also wenn das fuer mich anschaulich ist, solltest Du das auch hinbekommen ! mfg, Bjoern
hi nochmal. also meine Funktion ist: void Sendenstring(char *s) { while (*s) { USART_Transmit(*s); s++; } } das müßte eiogentlich richtig sein.Mein Problem ist wie definiere ich jetzt mein String un wie übergebe ich ihn?Bekomme da die ganze Zeit Fehlermeldung Möchte gerne "Name" übertragen .Byte für Byte
Habe auch noch eine allgemeine Frage.Kann man Die Daten, die man über USART zu einem anderen Modul schickt über eine TerminalProgramm überwachen bzw sehen was man verbrochen hat?
*s ist eine Zeigervariable die innerhalb deiner Funktion die Adresse deines String beinhaltet. volatile char Array_feld_Name[4]; //Deklarieren eines Datenfeld void main(void) { Array_feld_Name[0]='N'; //Datenfeld mit Ascii-Zeichen füllen Array_feld_Name[1]='a'; //geht auch anders Array_feld_Name[2]='m'; Array_feld_Name[3]='e'; Sendenstring(Array_feld_Name);// Deine Sendefunktion aufrufen } void Sendenstring(char *s) //hier wird jetzt die Adresse deines Array { //übernommen while (*s) { USART_Transmit(*s); s++; } }
Das geht in die Hose. Mit ziemlicher Sicherheit. Woran erkennt die Funktion "Sendenstring" das Ende des übergebenen Strings? while (*s) Am Null-Zeichen, mit dem der String terminiert ... sein sollte, aber nicht ist. Array_feld_Name muss Platz für (mindestens) fünf Zeichen bieten und das letzte Array-Element muss mit 0 besetzt werden, da sonst die Stringendeüberprüfung in "Sendenstring" kein Stringende findet, sondern munter weiter den Speicherinhalt ausgibt, bis zufällig mal eine Null vorbeikommt ...
Soll kein Vorwurf sein, ist ja eine der vielen beliebten Möglichkeiten, interessante Nebeneffekte mit C-Programmen zu erzielen ...
Und im ürigen muss das ja gar nicht so kompliziert sein (in diesem Falle) Ein simples Sendenstring( "Name" ); tuts auch.
Hallo.wie kann man das mit einem simpleln Sendestring("Name") implizieren.Das verstehe ich jetzt nicht
void main(void) { Sendenstring( "Name" ); // Deine Sendefunktion aufrufen } Du solltest dir ein C-Buch besorgen. Das sind C-Grundlagen.
Hallo.Ja da hast du ja recht.Habe jetzt die Funktion so aufgerufen wie dues gesagt hast.Bekomme immer die Fehlermeldung function parameter# 1 incompatible with its declaration
also habe die Funktion um einzelne Bytes zu senden : void USART_Transmit(unsigned char a) { while (!(UCSRA & (1<<UDRE))) ; UDR=a; } dann um einen string zu senden: void Senden_Von_String( char *s) { while(*s) { USART_Transmit(*s); s++; } } nun möchte ich "Name" senden: Senden_Von_String("Name");
Und auf welchen Aufruf bezieht sich jetzt die Fehlermeldung? (Ist es wirklich so schwer ein kompilierbares, vollständiges Program zu posten, sodass wir das einfach mal testweise durch unsere Compiler jagen um zu sehen, was die dazu zu sagen haben)
Wenn ich dein erstes Pgm durch den GCC jage, gibt es weder eine Warnung noch einen Fehler. Beim 2.ten sagt mir der Compiler In function 'Change_Bluetooth_Name': 105: error: 'n' undeclared (first use in this function)
Was wolltest du eigentlich damit? #define name n[9] Hängt das mit dem 'n' in Change_Bloototh_Name zusammen. Wolltest du etwa eine globale Variable 'n' definieren? Das geht dann so: char n[9]; und irgendwo weist du dem was zu: int main() { ... strcpy( n, "Hallo" ); } oder so: char n[] = "Hallo"; Auf jeden Fall aber: kauf dir ein Buch!!!
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.