Forum: Mikrocontroller und Digitale Elektronik Datenverlust bei Serieller Kommunikation


von Phil (Gast)


Lesenswert?

Hallo,

ich habe eine Frage bezüglich der Seriellen Kommunikation eines uc mit 
einem PC z.B. .

Ich habe es jetzt tatsächlich geschafft Signale an den uc zu senden und 
hab mir das ganze mal per JTAG ICE MKII im Detail angeschaut.

Was mich jetzt wundert ist, dass wenn ich n Breakpoint vor das Einlesen 
des UDR Registers setze, liest er den ersten char ein und sollte dann 
eigentlichen keinen weiteren empfangen. Und genau da ist mein 
Verständnis Problem.

Ich habe einen AT90PWM3B und der hat einen EUSART mit einem EUDR welches 
16bit auf einmal verarbeiten kann; statt der normalen 8bit. Ich habe 
E(!!)USART den aber nirgendwo explizit initialisiert, sonder einfach 
meine "normale" USART Kommunikation aufgebaut.

Als Terminalprogramm nutze ich HTerm hier ausm Forum.

Wie sendet so ein Terminalprogramm also wenn ich meinetwegen 4 chars 
sende, aber nur 1 auf einmal empfangen kann. Wie merkt das das Terminal 
Programm? Oder hängt das mit der Baudrate zusammen?

In meinem konkreten Fall sende ich 4 chars und empfange (während des 
debuggens) 2. Liegt das am AT90 oder an der Art und Weise wie das 
Terminalprogramm sendet?

Ich hoffe ihr versteht was ich meine :-D

von Timmo H. (masterfx)


Lesenswert?

Das Terminalprogramm weiß gar nichts von der Gegenstelle. Das schickt 
die Daten einfach nach den RS232-Standard raus (mit deinen Vorgaben von 
Geschwindigkeit, Start-, Stop- und Parity-Bit). Dein µC hat wohl durch 
das 16-Bit register halt einfach einen 2 Byte Buffer/Fifo.

von Guter Rat (Gast)


Lesenswert?

Gibt es außer der RxD und TxD-Verbindung noch eine Verbindung für
Handshake? (RTS).
Wenn nicht, ist es kein Wunder daß Zeichen verloren gehen.
Der Sender hat ja keine Ahnung, daß er nichts mehr senden darf.
Der Sendet einfach die 4 oder wieviel auch immr Zeichen, bis der String
zu Ende ist.

Dafür gibt es ja den "Handshake", ob HW-Handshake mit CTS/RTS oder
Per Software.
Der Sender kann vom Empfänger gestoppt werden, bis der wieder
aufnahmebereit ist.
Oder der Sender sendet das nächste Zeichen erst, nach dem der Empfänger
gemeldet hat: Bitte nächstes Zeichen.
Dann kannst Du den Empfang debuggen, der Sender wird halt angehalten,
bis Dein Empfänger wieder bereit ist.

von Phil (Gast)


Lesenswert?

Handshake gibt es nicht. nein.

Eine letzte Frage hierzu.

Ist es normal, dass man das UDR Register beim Debuggen nicht "angucken" 
kann. Es ist immer 0x00.

von Falk B. (falk)


Lesenswert?

@  Phil (Gast)

>Ist es normal, dass man das UDR Register beim Debuggen nicht "angucken"
>kann. Es ist immer 0x00.

Eigentlich nicht. Kann aber mit deiner Software zusammenhängen.

MFG
Falk

von Phil (Gast)


Lesenswert?

Hmm.. komisch.

Ich benutze die Methode hier aus dem Tutorial.

Uart mit Interrupt.

Es kann auch alles wunderbar hin und her gesendet werden. Es 
funktioniert quasi wie im Tutorial beschrieben.

Auch wenn ich nur den Code aus dem Tut verwende ändert sich der Inhalt 
des Registers nicht...

von Karl H. (kbuchegg)


Lesenswert?

Phil schrieb:

> Ist es normal, dass man das UDR Register beim Debuggen nicht "angucken"
> kann. Es ist immer 0x00.

Du meinst online, auf dem Chip?
Das UDR Register darf hardwaremäsig nur 1 mal gelesen werden! Bei jedem 
lesenden Zugriff auf UDR rückt das nächste Byte aus der FIFO nach.

Wenn dein Debugger das nicht berücksichtigt (und ich wüsste nicht, wie 
er das machen soll, ohne massiv ins zu debuggende Programm 
einzugreifen), bringst du mit dem Debugger die komplette Empfangsfifo 
durcheinandner.

Zumindest bei den Megaxx ist das so. Wird bei deinem Boliden nicht 
anders sein.

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.