interruptgesteuerte UART, string empfangen ATMEGA

Gast #1343530
Lesenswert?

ich hab auch eine :)

ansonst nimm die fleury lib und rufe solange getchar auf bis du ein 
stringendezeichen empfängst
dann is dein string da und du kannst ihn verarbeiten


ansonst die ISR etwas bearbeiten und einen buffer anlegen wo der längste 
string der vorkommen kann reinpasst

wenn ein zeichen kommt gucken ob es das endezeichen ost und buffer 
füllen

wenn endezeichen da, bearbeitung
#1343596
Lesenswert?

Timo P. schrieb:
> legt einer von euch den code offen?
>
> geht folgendes:

Probiers aus. Du kannst dabei nur lernen.
Wenn es nicht funktioniert, ist nicht viel kaputt. Wenn es funktioniert, 
dann hast du das befriedigende Gefühl, etwas verstanden zu haben.

Und ja: Misserfolg ist Teil des Lernprozesses.

>
>
> ISR(USART0_RXC_vect)
> {
>   if (i <= sizeof(Buffer))

Das kleiner-gleich ist Unsinn. Es muss kleiner heißen. In C wird bei 0 
angefangen zu zählen.
#1343667
Lesenswert?

Timo P. schrieb:
> wenn ich i im main auf 0 setzte, hast du recht...

Nicht nur dann.
Auch wenn du i in main auf 356 setzt, muss es immer noch 'kleiner' 
heißen.

In C wird bei 0 angefangen zu zählen. Das hat Auswirkungen.
zb hat ein Array welches auf 8 Elemente dimensioniert wird
1
  char Buffer[8];

und daher einen sizeof von 8 hat, immer noch die Elementindizes

  0, 1, 2, 3, 4, 5, 6, 7

zähl nach. Sind genau 8 Stück. Der größte gültige Index in ein Array ist 
immer um 1 kleiner als Anzahl der Elemente im Array. Wenn dein i daher 
sizeof erreicht hat, ist es nicht mehr zulässig einen Wert im Array zu 
speichern. Das entsprechende Arrayelement existiert schlicht und 
ergreifend nicht. In einem
1
   irgendein_typ Array[n]

ist das Element
1
   Array[ sizeof( irgendein_typ ) / sizeof( *irgendein_typ) ]

nicht existent.
OP #1344947
Lesenswert?

Wenn ich strings empfangen möchte, muss ich wohl entweder die 
Stringlänge kennen oder ein stringende-Zeichen benutzen.

Irgendwo auf Mikrocontroller.net habe ich sowohl \0 für einen standard 
C-string als auch \n gefunden. Jetzt bin ich verwirrt!

Prinzipiell ist es doch egal, welches Zeichen ich verwende oder? 
Lediglich der Vergleich von strings zb via:

strcmp(Buffer,"send values")

was genau müsste dann in Buffer drin stehen, damit strcmp eine 0 
zurückgibt?
wenn ich in C "send values" schreibe, dann ist das doch ein string mit 
\0 oder nicht?

wenn also in Buffer nur "send values" steht und es mit "send values" 
verglichen wird, ist eine Äquivalens wann gegeben? mit oder ohne 
stringendezeichen in Buffer?
#1345015
Lesenswert?

Du empfängst keinen String.

Du empfängst Zeichen. Punkt

Diese Zeichen sammelst du ein einem char-Array. Auf irgendeine Weise (zb 
indem dir der Sender vorab die Anzahl der Zeichen geschickt hat oder 
indem er ein '\n' schickt) weißt du, dass nach dem Empfang eines 
Zeichens die Übertragung von Zeichen abgeschlossen ist und die Summe all 
dieser Zeichen als String zu werten ist.

Damit aus einer Sequenz von Zeichen in C ein String wird, muss hinten an 
die Zeichen ein '\0' Character drann. Ab diesem Zeitpunkt hast du in 
deinem char-Array einen gültigen C-String, den du mit den C-Standard 
str... Funktionen bearbeiten kannst.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren