Forum: Mikrocontroller und Digitale Elektronik Probleme beim Ansteuern verschiedener Messgeräte über serielle Schnittstelle


von Sebastian U. (sulmer)


Lesenswert?

Hey,
ich steuer mit meinem NEC V850/FJ3 verschiedene Messgeräte über die 
serielle Schnittstelle an. Die Daten werden alle gesendet (laut Terminal 
Programm auf dem PC) dennoch meldet mein Messgerät Fehler wenn alle 
Daten gesendet werden. Setze ich Breakpoints und sende die Daten 
schrittweise funktioniert es. Daher denke ich das meine Daten zu schnell 
gesendet werden. Wollte erst ein paar Delays einbauen, was aber zu 
teilweise unnötigen Verzögerungen führt.
Schicke ich die selben Daten vom PC aus funktionierts, allerdings nutze 
ich da zwischen jedem Kommando den Befehl "fflush(com)".
Was genau macht "fflush()"? bzw. wäre es sinnvoll eine ähnliche Funktion 
für den Controller zu schreiben?

Danke für eure Hilfe

Grüße Sebastian

von 3360 (Gast)


Lesenswert?

flush leert den buffer

von Karl H. (kbuchegg)


Lesenswert?

> bzw. wäre es sinnvoll eine ähnliche Funktion
> für den Controller zu schreiben?

Das wird dein Problem nicht lösen.

Deine Analyse dürfte korrekt sein: Du überfährst deine
Messgeräte mit den Daten.
Normalerweise kann sich die Gegenstelle mit einem Verfahren
das sich 'Handshake' nennt, dagegen wehren. Im Prinzip sagt
die Gegenstelle deinem Programm dabei: 'Einen Moment, bitte
jetzt nichts senden, ich bin beschäftigt'.

Wenn sich jetzt dein Programm nicht um diese Warte-Mal-Nachricht
kümmert, dann ist klar, dass du die Gegenstelle überfährst.

Handshake gibt es in 2 Varianten:
* Softwarehandshake
* Hardwarehandshake

Jetzt musst du als allererstes mal rausfinden welche Variante
deine Messgeräte unterstützen (wenn überhaupt), und dann eine
entsprechende Behandlung in dein Programm einbauen.

von Sebastian U. (sulmer)


Lesenswert?

Jo das mit den Handshakes ist klar, dachte aber ich komm evtl. ohne aus, 
da es übern PC auch ohne Handshake funktioniert hat. Für nen 
Hardware-Handshake würde ich dann noch zusätzliche 2 Pins meines 
Controllers benötigen, was auch ein kleines Problemchen darstellen 
wird^^

Naja ich schau mal weiter ob ich ne andere Lösung find. Evtl. fahr ich 
einfach mit der Geschwindigkeit oder so bissl runter, mal schaun ob das 
schon genügt.

Danke für eure Antworten.

von Karl H. (kbuchegg)


Lesenswert?

Sebastian Ulmer wrote:

> Naja ich schau mal weiter ob ich ne andere Lösung find. Evtl. fahr ich
> einfach mit der Geschwindigkeit oder so bissl runter, mal schaun ob das
> schon genügt.

Schlechte Lösung.

Eine professionelle Lösung zur Behandlung einer seriellen
Schnittstelle beinhaltet immer eine Handshakebehandlung.
Denn: Du weißt nie, ob deine Gegenstelle zur Aufnahme von
Daten bereit ist. Erst durch ein Handshake kannst du dir
einigermassen sicher sein, daß es keine Probleme geben wird.

von Sebastian U. (sulmer)


Lesenswert?

Funktioniert alles super, hab aber nun nur einen Handshake mittels der 
RTS und CTS Leitung eingebaut. Da meine Pins am Controller knapp werden.
Funktioniert bei dem Agilent 33120A top. Jetzt wird das Gerät allerdings 
von einem Kollegen benötigt und ich muss nun mit einem Hewlett Packard 
33120A arbeiten, was leider nur einen DTR/DTS Handshake unterstützt.

DTR/DTS und RTS/CTS funktioniert doch in etwa gleich oder? Kann ich die 
DTR/DTS Leitungen einfach auf die RTS/CTS umleiten? oder hab ich bei der 
Beschreibung der Handshakes was überlesen? Für jede UART 4 Pins fürn 
Handshake zu opfern ist mir leider nicht möglich.

Danek schoneinmal im V.

Sebastian Ulmer

von Norgan (Gast)


Lesenswert?

Erst mal, es heisst D*SR* nicht DTS.

Dann, DSR/DTR ist leicht unterschiedlich zu RTS/CTS, allerdings sind die 
Unterschiede nicht besonders schlimm. Theoretisch zeigen Geräte mit DTR 
an, dass sie grundsätzlich bereit sind, nicht, dass sie gerade Daten 
empfangen können. In der Praxis wird das oft anders gehandhabt, nämlich 
wirklich zum Flow-Controll. Das muss allerdings nicht so sein. Daher: 
Erst mal genau das Handbuch des 33120A lesen. Macht der wirklich 
Flow-Controll über DTR?

Wenn dem so ist, dann kann man RTS durch DTR und CTS durch DSR ersetzen. 
Also den DTR Ausgang vom 33120A mit dem CTS Eingang am Controller und 
den DSR Eingang am 33120A mit dem RTC Ausgang vom Controller verbinden.

Alles unter der Annahme das der Mikrocontroller als DTE und der 33120A 
als DCE verkabelt ist.

von Sebastian U. (sulmer)


Lesenswert?

Ups stimmt DSR  bin bissl durcheinander gekommen^^

Hat sich aber nun doch erledigt, muss doch das Agilent Gerät verwenden, 
da die Programmierung auch kleine Unterschiede aufweist im Gegensatz zum 
HP.

Hab das mit dem DSR/DTR trotzdem mal genau nachgeschaut und probiert. 
Funktioniert ohne Probleme. Dann verstehe ich aber nicht wieso die 
Geräte nicht die CTS und RTS Leitungen zum FlowControl benutzen. Wäre 
doch eigentlich logischer. Naja auch egal.

von Norgan (Gast)


Lesenswert?

> Hat sich aber nun doch erledigt,

Dankeschön dass ich meine Zeit mit einer Antwort verschwenden durfte.

von Sebastian U. (sulmer)


Lesenswert?

Hab das auch erst gerade erfahren. Und umsonst war es ja trotzdem nicht. 
Probiert hab ich es und verwende jetzt bei dem Agilent Gerät auch den 
DSR/DTR Handshake und nicht mehr den RTS/CTS. Damits bissl einheitlicher 
bleibt

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.