Automatische RTS-Steuerung für RS-232-zu-RS-485-Konverter

Ich habe meinen Prototyp einer RS-485-Schaltung zum Laufen gebracht. Jetzt habe ich es über RS-232 an meinen PC angeschlossen, da ich den PC zum Master machen möchte. Wenn ich mich jedoch über Hyperterminal mit der Schaltung verbinde, geht die RTS-Leitung, die mit RE und DE verbunden ist, immer hoch. Der PC kann Daten an die Schaltung senden, aber nicht empfangen, da das RTS niemals niedrig wird. Das Umstellen des Handshakings von None auf Hardware hat nicht geholfen.

Ich habe später Modifikationen an der Schaltung vorgenommen, sodass auf der PIC-Seite der Pin, der RE und DE des SN75176 beim Übertragen von Daten hoch treibt, auch RE und DE des SN75176 auf der PC-Seite niedrig treibt, um den Empfang zu ermöglichen. Dadurch ändert sich die Linie von zwei auf drei. Es ist falsch, aber ich mache es nur, um zu sehen, wie es wirklich funktioniert, wenn der RTS-Pin richtig funktioniert.

Geben Sie hier die Bildbeschreibung ein

Wie mache ich weiter, damit der RTS-Pin richtig funktioniert? Ich weiß, dass ich einfach eine App mit Visual Studio erstellen kann, um eine Verbindung zur Leitung herzustellen und RTS manuell umzuschalten, aber das ist zu mühsam und ich hätte lieber eine Hardwarelösung, wenn möglich.

Menschen verwenden typischerweise einen Timer, um den Sender nach dem ersten Übergang für eine gewisse Zeitverzögerung aktiv zu halten. Nachfolgende Zeitverzögerungen würden die Zeit zurücksetzen und die Deaktivierung verzögern. Sie möchten, dass die Deaktivierungszeit länger ist als das maximale Intervall zwischen Übergängen in einer Übertragung (wahrscheinlich die meiste Zeit eines Zeichens), aber kürzer als das Intervall, bevor jemand anderes mit der Übertragung beginnt. Wenn Sie es so nah schneiden, ist es natürlich baudratenabhängig.

Antworten (3)

Dieser RS485-zu-RS232-Konverter von Mann - scheint das zu tun, was Sie tun, und Erfolge zu erzielen.

Es hört sich so an, als ob Hyperterminal in der Lage sein sollte, eine ordnungsgemäße RTS-Steuerung durchzuführen.

Eigentlich nein - er weist Hyperterminal manuell an, RTS zu aktivieren und zu deaktivieren, und wechselt dann in die benutzerdefinierte Software.
AFAIK gibt es keine "richtige RTS-Steuerung" im gewünschten Sinne - der RS232-Standard wurde für eine Punkt-zu-Punkt-Leitung geschrieben, nicht für einen Multidrop. RTS fragt nach der Verfügbarkeit der Leitung, denken Sie an ein Modem, das nach dem Einschalten initialisiert wird. Es gibt keine Anforderung an den Host, die Leitung zu irgendeinem Zeitpunkt freizugeben.
@WoutervanOoijen - Das RTS-Signal ist fast immer beliebig über die Software auf Treiberebene steuerbar, und die meisten Betriebssysteme ermöglichen dies auch über ihre serielle Haupt-API, obwohl es einen Haken gibt, den Sie sicherstellen müssen (auf Anwendungsebene möglicherweise ohne Zugriff auf niedrig Überprüfung auf Ebene, dh durch Verwendung eines Timers mit Sicherheitsabstand), dass die Daten tatsächlich übertragen und nicht nur zwischengespeichert wurden. Sogar auf Treiberebene kann es Arbeit erfordern, sicherzustellen, dass das letzte Byte das Schieberegister verlassen hat, da das Laden in das Schieberegister normalerweise die letzte Operation ist.
Ich sollte erwähnen, dass eine 2-Draht-Implementierung die Softwaresteuerung des Leitungstreibers aus High-Level-Code einfacher macht als eine 4-Draht-Implementierung, da Sie bei einer 2-Draht-Implementierung Ihre eigene Übertragung erhalten und das Ende davon empfangen können Beweis, dass die Puffer bis zum Draht gespült wurden und es sicher ist, Ihren Leitungstreiber zu deaktivieren.
@ChrisStratton: Ein Problem bei der Steuerung auf Softwareebene besteht darin, dass die meisten PC-COM-Ports heutzutage wirklich miese Timing-Eigenschaften haben und es möglicherweise keine Möglichkeit gibt, zu garantieren, dass RTS innerhalb von neun Zeichenzeiten nach der letzten Übertragung freigegeben wird. Wenn das entfernte Ende über einen guten seriellen Anschluss verfügt, kann es seine Antwort senden, während der Ursprungs-PC noch RTS hält.
Ich bin auf einige RS232-zu-RS485-Konverter gestoßen, die einen kleinen 555-Timer (monostabil) verwendeten, um eine autoRTS-Steuerung zu erreichen. es würde auf einem niedrigen Pegel auslösen und etwas länger als 10 Bitzeiten durchhalten. Dies war natürlich baudratenspezifisch und musste einen angemessenen Spielraum für Fehler haben, was bedeutete, dass Ihre Bearbeitungszeit durch die Fähigkeit des Timers begrenzt war, den Sender auszuschalten, damit die Antwort gehört werden konnte.
@AndrewKohlsmith: Ich habe einige extrem ähnliche Konverter gesehen, die auf ein Startbit triggern und etwa 1 einzelne Bitzeit lang niedrig halten. Es verzögert die Anfangsflanke des Startbits, aber da es auch jeden anderen logischen 1-zu-0-Übergang um den gleichen Betrag verzögert, funktioniert es gut.

FTDI-USB-zu-Seriell-Konverter wie FT232R, FT2232R, FT2232H usw., wenn sie in einem UART-Modus betrieben werden, haben einen Richtungs-Pin, der hoch geht, während der Chip sendet. Ich habe eine USB / RS-485-Konverterkarte mit einem FTDI-IC implementiert, und es funktioniert ohne Probleme. Das wollen Sie wahrscheinlich nicht hören, aber es ist wahrscheinlich die einfachste und zuverlässigste Methode. In Bezug auf RS-232 zu RS-485 erinnere ich mich, dass ich über die Verwendung eines Monostabilen gelesen habe, um das Richtungssignal für den RS-485-Treiber-IC bereitzustellen.

Auf meinem Orange Pi Zero habe ich das RTS über GPIO gesteuert ... Ich verwende Python, also definitiv nicht sehr genau, aber für eine 19200 UART - RS485-Verbindung zu meinem ABB-Wechselrichter ist es genau genug.

Ausschnitt:

ser = serial.Serial('/dev/ttyS1', 19200)
gpio.output(led, 1)
data ="\001\002\003\004"
ser.write(data)
print len(data)
sleep(len(data)*8.0/19200)
gpio.output(led,0)
sleep(0.1)
ser.close()

Ergebnis:

Geben Sie hier die Bildbeschreibung ein