Forum: Mikrocontroller und Digitale Elektronik datenübertragung


von Nora (Gast)


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
von NurEinGast (Gast)


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.
von Stefan (Gast)


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 !!!
von oldmax (Gast)


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