mikrocontroller.net

Forum: Compiler & IDEs UART char Array senden?


Autor: Patrick Bernhart (patrick)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Das hier:
void uart_puts (char *s) {
  //  loop until *s != NULL
  while (*s) {
    usart_putc(*s);
    s++;
    z++;
  }
}

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

Autor: Patrick Bernhart (patrick)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten, nur wie kann ich es richtig machen?

Gruss Patrick

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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));

;)

Autor: Patrick Bernhart (patrick)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Mario Leonhardt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Mario Leonhardt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mag eine "if-Schleife" sein?
Vermutlich meinst Du damit eine for-Schleife, denn die hast Du da ja
schließlich auch hingeschrieben ...

Autor: Mario Leonhardt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:( 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.