Forum: Mikrocontroller und Digitale Elektronik usart string


von Thomas (Gast)


Lesenswert?

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;
}

von Olaf K. (Gast)


Lesenswert?

Stichwort Ringbuffer.

AVR-Appnote mit C-Code: AVR306

Für Assembler: AVRFreaks Design Note #029 "Implementing FIFO Buffers
in Software"

MfG Olaf

von Thomas (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

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?

von Bjoern B. (tishima)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

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

von Bjoern B. (tishima)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

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?

von Witwenbetreuer (Gast)


Lesenswert?

*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++;
   }
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von Witwenbetreuer (Gast)


Lesenswert?

jap da hab ich gepennt sorry...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Soll kein Vorwurf sein, ist ja eine der vielen beliebten Möglichkeiten,
interessante Nebeneffekte mit C-Programmen zu erzielen ...

von Karl H. (kbuchegg)


Lesenswert?

Und im ürigen muss das ja gar nicht so kompliziert
sein (in diesem Falle)

Ein simples

  Sendenstring( "Name" );

tuts auch.

von Thomas (Gast)


Lesenswert?

thx.Ich werde das gleich versuchen

von Thomas (Gast)


Lesenswert?

Hallo.wie kann man das mit einem simpleln Sendestring("Name")
implizieren.Das verstehe ich jetzt nicht

von Karl H. (kbuchegg)


Lesenswert?

void main(void)
{
  Sendenstring( "Name" );   // Deine Sendefunktion aufrufen
}

Du solltest dir ein C-Buch besorgen.
Das sind C-Grundlagen.

von Thomas (Gast)


Lesenswert?

Ja.Aber manchmal kann man es einfach nicht mehr!Thx

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Ja.Aber manchmal kann man es einfach nicht mehr!Thx

Ein Buch besorgen?

von Thomas (Gast)


Lesenswert?

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

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Poste mal deinen Code! Keiner weiß, wie der inzwischen aussieht.

von Thomas (Gast)


Lesenswert?

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");

von Karl heinz B. (kbucheg)


Lesenswert?

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)

von inoffizieller WM-Rahul (Gast)


Lesenswert?

char *s

ist nicht das gleiche wie
unsigned char *s

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

ok !sorry

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

sorry ,war der Falsche .nun aber...

von Karl heinz B. (kbucheg)


Lesenswert?

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)

von Karl heinz B. (kbucheg)


Lesenswert?

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!!!

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

ja habe ich gesehen.Sorry bin gerade etwas konfus

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.