Forum: Mikrocontroller und Digitale Elektronik uart sd-Karte xon/xoff


von Andi S. (laserandi)


Lesenswert?

Hallo Leute,
ich möchte eine sd-Karte mit mehr als 512-Byte Daten über uart "RAW" 
beschreiben.
Situation:
- Hardware ATMEGA32 mit 14,7456 MHz Quarz
- uart funktioniert
- schreiben/lesen der sd-Karte funktioniert

Problem:
Ich habe keinen PORT mehr für eine Hardware-Flußkontrolle frei, die ich 
aber
benötige, da immer 512 Byte große Blocks auf die Karte geschrieben 
werden
müssen.

Mein Lösungsansatz:
Software-Flußkontrolle via XON/XOFF.

Ergebniss:
Der PC sendet immer noch eine bestimmte Anzahl von Daten nachdem
XOFF vom µC gesendet wurde. Das führt beim Empfang des nächsten
512-Byte großen Blocks immer zu einem "Data Over Run" der uart-
Schnittstelle und zu Datenverlust der vorher zu viel gesendeten
Bytes.

Frage:
Wieso sendet der PC nach XOFF immer noch ein paar Daten?
(Dieser Fehler tritt bei allen Terminalprogrammen auf minicom, 
wxterm...)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die UART-Hardware des PCs verwendet einen Hardware-Sendepuffer. Der wird 
automatisch geleert, d.h. alle in ihm gespeicherten Daten werden 
übertragen. Empfängt der PC nun ein XOFF, so hört er zwar auf, diesen 
Sendepuffer zu befüllen, die UART-Hardware aber leert diesen Puffer 
weiterhin, da sie selbst sich für Software-Handshake nicht interessiert.

Zusätzlich zum UART-Hardware-Sendepuffer ("Fifo", je nach Ausführung der 
UART zwischen 16 und 128 Bytes) kommt dann noch ein 
UART-Hardware-Empfangspuffer ins Spiel. Dieser wird vom PC unter zwei 
Umständen ausgelesen - wenn er voll ist oder wenn Daten darin enthalten 
sind und eine gewisse Wartezeit verstrichen ist. Die Auswertung eines an 
den PC gesandten XOFF kann sich also auch noch durch diesen 
UART-Hardware-Empfangspuffer verzögern.

Abhilfe: Einen ausreichend großen Empfangspuffer vorhalten. Oder Deine 
Portbelegung nochmal genau ansehen, um doch einen Hardwarehandshake zu 
implementieren. Eine Leitung genügt ja.

von Andi S. (laserandi)


Lesenswert?

Danke, für die schnelle Hilfe.
Ich habe schon befürchtet das es so etwas ist.
Die Hardware ändere ich nur sehr ungern, da die Platine
schon geätzt und gelötet ist.
Vielleicht kann man das Problem mit einem Ringpuffer lösen.
Ich werde mich mal einlesen.

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.