Hallo, ich hab ein Problem mit meinem ATMega128. ich habe drei Array's mit Zeichen die ich über den UART0 versenden möchte: //global static char initTx1[] = {0x10, 0x40, 0x40, 0x16}; static char initTx2[] = {0x68, 0x08, 0x08, 0x68, 0x73, 0xA9, 0x96, 0x18, 0x34, 0x56, 0x78, 0x0A, 0xd6, 0x16}; static char initTx3[] = {0x68, 0x06, 0x06, 0x68, 0x53, 0xA6, 0x01, 0x01, 0x16, 0x00, 0x11, 0x16}; dazu wollte ich die Funktion uart_puts() sowie usart_putc() verwenden. Das Array soll dann im Main verschickt werden: void usart_putc(unsigned char c) { // wait until UDR ready while(!(UCSR0A & (1 << UDRE))); UDR0 = c; // send character } void uart_puts (char *s) { // loop until *s != NULL while (*s) { usart_putc(*s); s++; z++; } } //main... uart_puts (initTx1); uart_puts (initTx2); uart_puts (initTx3); das Problem ist nun, dass das erste Array verschickt wird. Dann beginnt er das zweite Array zu versenden. Nun aber kommt es, am Ende des zweiten Array hängt er nun den Inhalt erste Array wieder an ?? ist mir rätselhaft wie er dazu kommt? Dannach werden vom dritten Array nur die ersten zeichen verschickt danach wird die Sendeschleife verlassen? Was mache ich den da Falsch? bzw. wie könnte man es noch machen? Gruss Patrick
Du versuchst, mit string-Semantik (\0 beendet den String) zu senden, hast aber kein \0 dran. Entweder explizit die Länge angeben (einzige Chance, wenn die Zeichenfolge auch \0 selbst enthalten können soll) oder aber \0 explizit mit in die Arrays aufnehmen.
Hi! Das hier:
1 | void uart_puts (char *s) { |
2 | // loop until *s != NULL
|
3 | while (*s) { |
4 | usart_putc(*s); |
5 | s++; |
6 | z++; |
7 | }
|
8 | }
|
Kann Strings senden. Strings werden in C durch eine Null beendet (terminiert). Bei Deinem ersten array sendet diese Routine also so lange, bis irgendwo im Spiecher hinter 'initTx1' eine Null erscheint (auch als: 0x00, \0, 0 im Quelltext zu lesen). Das kann ganz Zufäöllig direkt hinter dem eigentlichen Array der Fall sein. Beim Zweiten array das Gleiche. Beim dritten Array müssten alle Bytes inklusive dem ersten 0x16 Übertragen werden, danach steht nämlich die 0...
Danke für die Antworten, nur wie kann ich es richtig machen? Gruss Patrick
zb so ... void uart_put_n (char *s, unsigned n) { // loop until *s != NULL while (n--) { usart_putc(*s); s++; z++; /* P.S: was ist z???? */ } } //main... uart_put_n (initTx1, sizeof(initTx1)); uart_put_n (initTx2, sizeof(initTx2)); uart_put_n (initTx3, sizeof(initTx3)); ;)
Hallo, die Schleife klappt! allerdings hab ich das Problem das mein Gerät auf den Frame initTx3 nicht reagiert. Ich hab mir den Frame mit dem Oszi angeschaut und die Vermutung das es etwas mit dem 0x00 im Frame zu tun hat. Ist es notwendig spezielle Einstellungen des UART vorzunehmen? Kann das Zeichen verfällscht werden? Sende ich 0x00 messe ich ein High am Port, sollte dies nicht aber Low sein? Da ich nicht sicher war ob der Frame auch wirklich tut hab ich diesen mal mit VB an mein Gerät geschickt. Siehe da da tut es und der Frame sieht auch etwas anders aus. Patrick
Hallo... Vielleicht hilft Dir das... Ich nehme anstelle der while schleife ein if-schleife. Da ich auch die länge mit übergebe weiss ich ja wie lang ich laufen muss. Sieht etwa so aus: static char inquireString[] = { 0x02, 0x52, 0x00, 0x03, 0x00, 0x55, 0x0A, 0x00, 0x00, 0x03 }; : . void USART_Transmit( char *command, uint8_t le ) { uint8_t i; /* Übertragung starten */ for (i = 0; i < le; i++) { USART_TransmitChar(*command); command++; } } : . USART_Transmit(inquireString, 10); MfG Leo
oh man... hab jetzt erst gesehen das Werner ja schon ne lösung mit ner while über die angabe der länge gepostet hat... sorry... Ich hatte allerdings am anfang beim senden über die usart (beim ttiny 2313) probleme mit falsch übertragenen zeichen weil der interne oszilator nicht stabiel genug war, mit nem externen 10Mhz Quarz läufts jetzt sauber... vielleicht hilf ja wenigstens das weiter :( Leo
Was mag eine "if-Schleife" sein? Vermutlich meinst Du damit eine for-Schleife, denn die hast Du da ja schließlich auch hingeschrieben ...
:( ich glaub ich geh für heute am besten gleich wieder ins bett... Aber so ist das eben wenn man hier ins forum schreibt und gleichzeitig überlegt was man im programm noch ändern muss... Leo
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.