datenübertragung

Gast #2404075
Lesenswert?
• ▲
▼
Hallo,

ich habe ein kleines Problem bei meiner Datenübertragung per USART.
Ich speicher die Daten in einem Ringpuffer via Interrupt:

Puffer[x] = U1RXBUF //Puffer ist ein 200char array und beides globale 
Var
x++;

Davon wird dann nur der erste Wert übernommen

p = strtok(Puffer,",_");   // char *p;

mittels einer Schleife wird das ganze in zwei Var aufgesplittet:

for (i=0;p!=NULL; i++)
{
  if (i==0) Channel= p;
  if (i==1) Wert=p;
  p = strtok (NULL,",_");
}

Output (Channel,Wert);  // Ausgabe der Variablen

Also jetzt zu meinem Problem. Wenn ich das erste Mal daten sende, dann 
gibt er den Wert auch korekt aus. Beim senden des zweiten, dritten, 
vierten Befehls gibt er nru noch null aus.
Falls ich die Zeile:
x=0; //hinter Output einfüge dann funktioniert es. Aber dann ist es ja 
kein Ringpuffer mehr ;-). Also ich vermute, dass er die ersten Befehle 
nicht richtig löscht.

über Tipps bin ich sehr dankbar.

Nora
Gast #2404091
Lesenswert?
• ▲
▼
Zeig uns doch mal dein ganzes Programm. Ich sehe hier vieles nicht.
- Wo wird x für den Ringbuffer wieder zurückgesetzt ?
- mit strtok(Puffer...) wird ja immer am Anfang angefangen, bein nen 
Ringbuffer kann der Anfang aber irgendwo in der Mitte stehen.
- Wo wird Dein buffer wieder geleert. usw. usw.

Sprich - zeig mal alles, dann kann man sich ein besseres Bild machen.
Gast #2404093
Lesenswert?
• ▲
▼
Hallo,

wie kommst du nur darauf dass das was du da gemacht hst ein Ringpuffer 
ist ?
Und wie soll die Standardfunktion "strtok" da etwas vernünftiges 
erkennen können.
Da gibts ein grosses Missverständnis !!!
Gast #2404258
Lesenswert?
• ▲
▼
Hi
In C kann ich zwar nicht helfen, aber in Assembler arbeite ich auch mit 
einem Ringpuffer. 200 Bytes ist schon ordentlich.... Sind deine 
Übertragungen wirklich so umfangreich?
Doch das ist eigentlich egal, nur mal so...
Du hast die Anfangsadresse von deinem Puffer. Dazu brauchst du einen 
Schreibzeiger und einen Lesezeiger. Kommt ein Zeichen, schreibst du es 
an die Adresse vom Puffer+ Schreibzeiger. Anschließend wird der 
Schreibzeiger erhöht und die Grenze abgefragt. Evtl. je nach Ergebnis 
setzt du den Schreibzeiger wieder auf 0
Im Programm stellst du fest: Ah, Lese- und Schreibzeiger sind ungleich, 
da ist was neues gekommen....
Also, Information aus Pufferadresse+Lesezeiger auslesen und in einen 
Arbeitsbereich kopieren, Lesezeiger erhöhen und Grenze abfragen, ectl. 
auf 0 setzen. So braucht der Ringpuffer gar nicht so groß zu sein. 
Nebenbei kannst du die Bytes mitzählen und dann, wenn die Übertragung 
komplett ist, den Arbeitsstring in einen Ausgabekanal umkopieren oder 
sonstwas damit machen.
Durch den Ringpuffer löst du nur den Datenempfang vom Programm ab. Je 
nach Baudrate und Datenmenge sowie Programmumfang dürfte ein Ringpuffer 
von 1,5 bis 2 facher im Block empfangener Datenmenge völlig ausreichen.
Gruß oldmax

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.