PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Inhalt eines Arrays über USART ausgeben



casa74
10.08.2005, 20:25
Hallo Zusammen,

möchte gerne den Inhalt einer Variablen im Mega8, über den TX-Pin des
USART ausgeben
Möchte dazu den C-Code verwenden, den ich hier im Forum mal gefunden habe .
Wäre euch sehr dankbar, wenn ihr mir sagen könntet ob ich den code richtig
verstanden habe und ob man ihn für meine Zwecke so anwenden kann.

Und wenn ja, könnte man nach dem selben Prinzip nicht auch den Inhalt
eines Arrays über usart ausgeben ?

Vielen Dank schonmal im Vorraus

Gruß
Casa74




void USART_puts(char* data) /* Funktionsaufruf mit zeiger auf Variable
Data * (bin mir hier nicht ganz sicher)*/
{
uint16_t i; /* uint16_t bekommt den Variablennamen i */

for(i=0;i<strlen(data);i++) /*16Bit langer Variableninhalt wird
hochgezählt, solange i kleiner als die Länge
von "data" (ohne \0) */

{
USART_putc(data[i]); /* Innerhalb der for- Bedingung wird einzeln
Jedes Bit uber usart ausgesendet */
}

kater
10.08.2005, 20:34
USART_putc(data[i]); /* Innerhalb der for- Bedingung wird einzeln
Jedes Bit uber usart ausgesendet */
Hier wird jedes Zeichen einzeln gesendet. Sonst ist soweit alles richtig.
Mit einem Array wuerde es auch gehen. Es wird solange gesendet, bis die Schleufe auf ein '\0' trifft das das ende vom String angibt.

Psiyou
10.08.2005, 21:10
Hallo,
soweit alles richtig, würde allerdings "i<strlen(data)" gegen "*(data+i)" (bzw "data[i]" was genau das gleiche ist) austauschen(natürlich ohne die ").
Da ist der Rechenaufwand für den Prozessor wesentlich geringer.
Wenn Du Verständnissprobleme hast, meld Dich einfach.
Philipp

SprinterSB
10.08.2005, 21:53
Hallo,
soweit alles richtig, würde allerdings "i<strlen(data)" gegen "*(data+i)" (bzw "data[i]" was genau das gleiche ist) austauschen(natürlich ohne die ").
Da ist der Rechenaufwand für den Prozessor wesentlich geringer.
Wenn Du Verständnissprobleme hast, meld Dich einfach.
Philipp

Also um Effizienz ging es auch nicht, sondern erst mal ums Verständnis,
und da ist der Code von casa74 genau richtig.

Zum Verständnis ist so was wie


void USART_puts (char *data)
{
char c;

while (c = *(data++), c)
USART_putc (c);
}

nicht gerade hilfreich.

Psiyou
10.08.2005, 21:59
@ SprinterSB
Hm, so im Nachhinein hast wohl recht, da war ich wohl etwas zu voreilig...
Soll nicht wieder vorkommen.

casa74
11.08.2005, 08:14
Ja super!
Vielen Dank für eure Tips und Alternativen.
Ist schön wenn man mal was richtig verstanden hat :D

Habe hier das ganze mit einem Array probiert.
Weiss hier allerdings nicht wie man innerhalb eines Array-inhalts das letzte /0 ausschliessen kann.


Gruß und Danke !

Casa


void USART_puts(char* array[255]) /* Funktionsaufruf mit zeiger auf array */

int i /* Einfache Zählervariable */

{ for (i=0; i<255; i++) /*array wird hochgezählt, solange i kleiner als die Länge des arrays */
{
USART_putc(array[i]); /* Innerhalb der for- Bedingung wird einzeln
Jeder Inhalt des Array seriell über usart
ausgesendet */
}
}

PicNick
11.08.2005, 10:51
for (i=0; i<255; i++) /*array hochgezählt, solange i kleiner als Länge */
{
if (!array[i]) /* => if (array[i] == '\0')
break; /* bei NULL raus aus der Schleife */
USART_putc(array[i]);
}

Thorsten
11.08.2005, 15:06
Hi,

würde so doch auch gehen, dann spart man die if abfrage:



for (i=0; array[i] != '\0'; i++) /*Schleife ausführen solange */
USART_putc(array[i]);


Dann musst du aber sicher sein das eine \0 vorkommt, sonst schickt er den ganzen Speicher raus:-)

Psiyou
11.08.2005, 17:25
Hm...
wenn ich das jetzt so sehe sind wir jetzt an genau dem gleichem Code den ich in meinem ersten Beitrag vorgeschlagen hatte...