Forum: Compiler & IDEs UART char Array senden?


von Patrick B. (patrick)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

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

von Patrick B. (patrick)


Lesenswert?

Danke für die Antworten, nur wie kann ich es richtig machen?

Gruss Patrick

von Werner B. (Gast)


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));

;)

von Patrick B. (patrick)


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

von Mario Leonhardt (Gast)


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

von Mario Leonhardt (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von Mario Leonhardt (Gast)


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

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.