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
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....
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?
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.
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.
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.
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.
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?
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_tbuffer[5]={'1','2','3','4','5');
würde er ASCII Zeichen senden, die du am Terminal dann als "12345"
siehst.
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.
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.