Forum: Mikrocontroller und Digitale Elektronik array über uart übertragen


von Mark (Gast)


Lesenswert?

Hallo, ich habe einen Array und möchte davon einzelne Felder über UART 
übertragen.
Die UART-Übertragung an sich funktioniert, jedoch nicht mit einem array
1
...
2
uint8_t buffer[5] = {1,2,3,4,5};
3
...
4
usart_transmit_char(mirf_buffer[0]);
5
usart_transmit_char(5);
6
...
1
void usart_transmit_char(unsigned char data){
2
  /* Wait for empty transmit buffer */
3
  while ( !( UCSR0A & (1<<UDRE0)) );
4
  /* Put data into buffer, sends the data */
5
  UDR0 = data;
6
}

jedoch bekomme ich nur kryptische Zeichen. Die Zahl (die 5 aus dem 
zweiten aufruf) kommt ganz normal an. Das ganze mache ich mit einem 
Atmega328p.
Was habe ich falsch gemacht?

Mark

von fraezeichen (Gast)


Lesenswert?

Was ist mirf_buffer[0]?

Ein bisschen mehr Quelltext hätte viel schönes...

von fragezeichen (Gast)


Lesenswert?

Mit der (5) übergibst du UDR0 = data sauber 8 Bit. Breiter ist die 
Übertragung bei 8 Bit halt nicht.
Was du in mirf_buffer hast, kann hier kein Mensch erahnen....

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Mark schrieb:
> Was habe ich falsch gemacht?

 Angenommen, du willst in wirklichkeit buffer senden (und nicht
 mirf_buffer).
 Dann ist:
1
 uint8_t buffer[5] = {49, 50, 51, 52, 53};

von Mark (Gast)


Lesenswert?

oh, mirf_buffer war noch eine alte Variable. das habe ich geändert. 
trotzdem kommt nur müll raus. aber buffer[0]=0 sind doch auch nur 8bit 
oder nicht? was ist daran anders als 5?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Mark schrieb:
> oh, mirf_buffer war noch eine alte Variable. das habe ich geändert.
> trotzdem kommt nur müll raus. aber buffer[0]=0 sind doch auch nur 8bit
> oder nicht? was ist daran anders als 5?

 5 beim zweiten Aufruf wird von deinem Compiler als ASCII '5' (53)
 übersetzt.

von fragezeichen (Gast)


Lesenswert?

Ein bisschen mehr Quelltext hätte viel Schönes...............

von Karl M. (Gast)


Lesenswert?

Marc V. schrieb:
> 5 beim zweiten Aufruf wird von deinem Compiler als ASCII '5' (53)
>  übersetzt.

Das stimmt nicht ! eine 5 = 0x05 = 0b0101 und nichts anders.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Karl M. schrieb:
> Das stimmt nicht ! eine 5 = 0x05 = 0b0101 und nichts anders.

Mark schrieb:
> jedoch bekomme ich nur kryptische Zeichen. Die Zahl (die 5 aus dem
> zweiten aufruf) kommt ganz normal an.

 5 ist Kontrollzeichen und wird auch als solches angezeigt (senkrechter
 Balken).
 Wenn die 5 ganz normal ankommt (als 5 und nicht als kryptisches
 Zeichen), dann hat entweder sein Compiler das entsprechend übersetzt
 oder der TO sagt nicht die Wahrheit.

 Such dir eins davon aus, mir ist es egal.

von Wolfgang (Gast)


Lesenswert?

Mark schrieb:
> jedoch bekomme ich nur kryptische Zeichen.

Womit guckst du dir die Daten an? Vielleicht ist auch der Empfänger bzw. 
die Darstellung am Empfänger nicht ganz unbeteiligt.

von Hosenmatz (Gast)


Lesenswert?

1. Welcher Typ von uC wird verwendet?
2. Was ist die Taktquelle für Deinen uC?
3. Welche Taktfrequenz?
4. Welches sind die vor der 5 übertragenen Zeichen?
5. Was kommt tatsächlich an? Falls Zeichen nicht benennbar, mache bitte 
ein Bildschirmfoto und poste das hier?

von Stefan F. (Gast)


Lesenswert?

Bis du ganz sicher, dass das Array die erwarteten Werte enthält? Ein 
Stack-Überlauf bewirkt unter anderem, das Variablen unerwartete Werte 
enthalten.

von Purzel H. (hacky)


Lesenswert?

Ein ueblicher Fehler ist mit den zweiten Zeichen nicht zu warten und 
somit das gespeicherte zu ueberschreiben.

von Stefan F. (Gast)


Lesenswert?

> Ein ueblicher Fehler ist mit den zweiten Zeichen nicht zu warten

Er wartet aber, sieht man am geposteten Stück Quelltext.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Kann es sein, das du einfach buffer[0], der ein 0x01 (= Ctrl-A) enthält 
sendest, aber erwartest das es eine '1' ( = 0x31) ist?

Wenn du deinen Buffer so initialisierst:
1
uint8_t buffer[5] = {'1','2','3','4','5');
würde er ASCII Zeichen senden, die du am Terminal dann als "12345" 
siehst.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Matthias S. schrieb:
> Wenn du deinen Buffer so initialisierst:
> uint8_t buffer[5] =  {'1','2','3','4','5');
> würde er ASCII Zeichen senden, die du am Terminal dann als "12345"
> siehst.

 Das war schon vor 3 Tagen:
 Beitrag "Re: array über uart übertragen"

 Der TO hat wahrscheinlich seinen Fehler korrigiert, aber da er
 noch nie etwas von Netiquette gehört hat, meldet er sich nicht mehr.

von Peter D. (peda)


Lesenswert?

Sobald man mehr als ein Byte senden will, braucht man erstmal ein 
Protokoll, d.h. eine Regel, nach der der Empfänger eindeutig feststellen 
kann, wann ein Paket beginnt und wann es endet.
Daneben ist es nicht verkehrt, wenn der Empfänger auch erkennen kann, ob 
ein Paket gestört oder unvollständig ist. Der Master kann ja mitten im 
Paket einen Watchdogreset gemacht haben, das Kabel kurz mal gezogen 
worden sein, ein Spannungseinbruch usw.

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.