2008-08-06 19 views
39

Ich muss Daten über serielle Verbindungen (RS-232 und RS-422) senden und empfangen.Wie konfiguriere und kommuniziere ich mit einer seriellen Schnittstelle?

Wie richte ich eine solche Verbindung ein und kommuniziere mit ihr? Wie finde ich heraus, wie die Konfigurationseinstellungen (z. B. Baudrate) sein sollten und wie setze ich sie ein?

Insbesondere suche ich in Java, C/C++, oder einer der wichtigsten Unix-Shells, aber ich habe auch Interesse an der seriellen Programmierung mit Windows/Hyperterminal.

Antwort

27

Baue eine Zeitmaschine und gehe zurück bis 1987? Ho ho.

Ok, keine snarky Kommentare.

Wie kann ich herausfinden, was die Konfigurationseinstellungen (z Baudrate) sollte ...

das Datenblatt lesen? OK OK. Ernsthaft, letzter. Wenn Sie die Baudrate des Geräts, mit dem Sie kommunizieren möchten, nicht kennen, haben Sie zwei Möglichkeiten. Beginne zu raten oder bring vielleicht einen O-Scope raus. Wenn Sie einen guten Ausgangspunkt brauchen, lassen Sie mich 9600-8-N-1 vorschlagen. Mein Verdacht ist, dass Sie relativ schnell mit roher Gewalt dorthin gelangen können. Es gibt eine dritte Möglichkeit, einen Old-School-Ninja zu haben, der durch die LOOK der entstellten Zeichen bei einer Standard-Baudrate die tatsächliche Baudrate erkennen kann. Ein beeindruckender Party-Trick um sicher zu sein.

Hoffentlich haben Sie Zugriff auf diese Informationen. Unter unix/linux können Sie herausfinden, ob minicom direkt mit dem seriellen Port spielt. Dies sollte es ziemlich schnell machen, die Konfiguration herauszufinden.

eine der wichtigsten Unix shells

In Unix die serielle Schnittstelle (n) ist/sind, Datei-mapped in das/dev/subdir. ttyS0, zum Beispiel. Wenn Sie die richtige Baudrate einstellen und nicht Minicom verwenden, können Sie sogar Dateien in diese Datei katapultieren, um Daten dorthin zu senden.

Auf das Fleisch der Frage, können Sie es programmgesteuert über die POSIX-Header zugreifen. termios.h ist der Große.

See: http://www.easysw.com/~mike/serial/serial.html#3_1 (nicht mehr erhältlich)

aber ich habe auch ein gewisses Interesse an seriellen Programmierung unter Windows/Hyperterminal.

Hyperterminal und Minicom sind im Grunde das gleiche Programm. Wie Windows Ihnen Zugriff auf die serielle Schnittstelle ermöglicht, überlasse ich diese Frage für jemand anderen. Das habe ich seit den Win95-Tagen nicht mehr in Windows gemacht.

2

Von der anderen Seite, wenn Sie es mit C# tun wollen, die sowohl unter Windows als auch unter Linux laufen wird - mit einigen limitations (EDIT: die veraltet sein kann. Ich habe keine Möglichkeit, es zu testen.) . Erstellen Sie einfach ein SerialPort Objekt, stellen Sie die Baudrate, den Port und andere ungerade Einstellungen ein, rufen Sie es auf und schreiben Sie Ihr Byte [] s aus. Nach all dem Setup verhält sich das SerialPort-Objekt sehr ähnlich wie jeder vernetzte Stream. Es sollte also einfach genug sein, um es herauszufinden.

Und als Ibandy-Staaten, müssen Sie alle diese Einstellungen, wie Baud-Rate, kennen, bevor Sie überhaupt versuchen, mit einem seriellen Gerät zu kommunizieren.

2

Bei der Arbeit verwenden wir terterm und realterm zum Überprüfen der seriellen Daten ist korrekt formatiert. Außerdem haben wir einen Hardware-Splitter mit einem Switch, so dass wir den Verkehr zu unserer Anwendung über ein Kabel zurück zu einem anderen Port überwachen können.

Windows ermöglicht den Zugriff auf die serielle Schnittstelle über CreateFile. Das gibt Ihnen ein Handle und von dort aus können Sie den Zugriff konfigurieren.

1

Von Java die rxtx (nicht mehr verfügbar) Bibliothek ist ziemlich gut. Es greift dort auf, wo das serielle IO-Framework von Sun aufgehört hat.

+0

Der obige Link ist tot. Siehe [RXTX-Wiki] (http://rxtx.qbang.org/). – George

7

Für C/C++ unter Windows Sie hat (mindestens) zwei Möglichkeiten:

  1. die Serialport-Klasse Verwenden von .NET zur Verfügung gestellt.
  2. Verwenden Sie die Win32-API. Es gibt eine extensive MSDN article aus dem Jahr 1995, und viele kostenlose Bibliotheken und Beispiele im Internet, um loszulegen.

Die .NET-Option wird viel einfacher.

9

Wenn Sie in Java codieren möchten, empfehle ich SerialIOs . Es ist sehr einfach zu bedienen und spart Ihnen Arbeitstage. Ich habe nie eine Open-Source-Bibliothek so gut wie SerialIO gefunden, wirklich!

Mein Rat: Verwenden Sie nicht das serielle IO-Framework von Sun! Es ist von 1998 und voller Bugs. Sie können rxtx verwenden, aber serialio ist besser!

3

Wenn es Cross platfrom sein muss, würde ich empfehlen, Boost Asio zu betrachten.

2

Vorbei schrieb ich eine anständige Anwendung, um Verbindungen von einer Farm von Modems zu einer TCP/IP-Netzwerkadresse zu leiten.

Zunächst suchte ich nach einer freien (freien) seriellen E/A-Bibliothek. Ich habe Suns, IBMs und RxTx versucht. Sie waren in Ordnung für die Entwicklung der Anwendung und in ersten Tests, aber in der Produktion erwiesen sie sich jeweils als instabil.

Schließlich habe ich für SerialPort SerialIO bezahlt. Konvertieren war buchstäblich eine Übung in wechselnden Importen, und die Bibliothek wurde absolut Rock Solid - ich kann es nicht genug empfehlen. Meine Anwendung läuft seit einigen Jahren rund um die Uhr im Einsatz, ohne dass mehrere Kunden Probleme haben.

Wenn Sie die Entwicklung mit SerialPort starten, haben sie eine bessere API und ich würde sie verwenden.

Wenn Sie plattformübergreifende Unterstützung benötigen, war Java mit SerialPort die beste Wahl, die ich finden konnte.

Schließlich ist ihre Lizenzierung ziemlich vernünftig, solange Sie keine Software auf dem Gerät für Ihre Kunden vorinstallieren.

+0

Wann haben Sie RxTx und SerialPort zuletzt benutzt? Ich bin gespannt, ob sich RxTx verbessert hat. – Gili

+0

@Gili: Es war vor einigen Jahren, für RxTx - ich kam nie wieder nach dem Kauf von SerialPort zurück, da wir nie Probleme mit SerialPort hatten und keine Lizenzgebühren, also keine Motivation, Zeit in RxTx zu investieren. –

+0

@Gili: SerialPort wird derzeit von unseren Kunden verwendet. –

0

Abhängig von dem Gerät, mit dem Sie kommunizieren möchten, können mehr Parameter als Baudrate, Anzahl der Datenbits, Art der Paritätsprüfung und Anzahl der zu berücksichtigenden Stoppbits vorhanden sein.Wenn ich mich richtig erinnere, verwenden Modems neun Zeilen der RS-232C-Schnittstelle. Einige Geräte, wie z. B. Kassen, können Hardware-Handshake auf RTS/CTS-Leitungen oder auf DTR/STR-Leitungen verwenden.

Im Allgemeinen ist es gut zu wissen, wie die Schnittstelle funktioniert. Sie können nicht kommunizieren, wenn die Baudrate nicht übereinstimmt, aber die falsche Einstellung anderer Parameter funktioniert möglicherweise. Zum Beispiel können Sie einfach Daten an das Gerät senden, die 1 Stoppbit mit 2 gesetzten Stoppbits erwarten. Probleme treten auf, wenn Sie in einem solchen Fall versuchen, Daten zu empfangen. Sie können auch in geeigneter Weise eingestellt Paritätsbit als eines der Stop-Bits, etc. verwenden

0

Ich habe purejavacomm benutze: It is an implementation of javax.comm written in pure java + JNA

Im Gegensatz zu rxtx, brauchen Sie nicht eine DLL zu installieren. Es ist in reinem Java + JNA geschrieben, was das Problem der Portabilität zwischen Windows und Linux für mich gelöst hat. Es sollte einfach sein, auf andere Betriebssysteme zu portieren, die JNA unterstützt, wie Solaris und FreeBSD, aber ich habe es nicht versucht.

Sie könnten erwarten, dass eine reine Java-Bibliothek hinter einer nativen Implementierung wie rxtx in der Leistung zurückbleibt, aber bei modernen CPUs ist der Flaschenhals höchstwahrscheinlich die Bitrate Ihrer seriellen Schnittstelle, nicht CPU-Zyklen. Außerdem ist es viel einfacher zu debuggen als eine gemischte Java/Native-Bibliothek oder reiner kompilierter nativer Code.

0

Wenn Sie einen bestimmten Compiler ich Qt verwenden vorschlagen zu verwenden gezwungen und in der neuen Version 5.3 finden Sie eine Klasse auf serielle Schnittstellen gewidmet zu finden:

http://qt-project.org/doc/qt-5/qserialport.html

Der Code Sie schreiben wird laufen auf allen unterdrückten Qt-Plattformen, zumindest denen, die serielle Ports haben.