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

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