java - Wie konfiguriere und kommuniziere ich mit einer seriellen Schnittstelle?

Translate

Ich muss Daten über serielle Verbindungen (RS-232 und RS-422) senden und empfangen.

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

Insbesondere möchte ich dies in Java, C / C ++ oder einer der wichtigsten Unix-Shells tun, aber ich habe auch ein gewisses Interesse an der seriellen Programmierung mit Windows / Hyperterminal.

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Eine Zeitmaschine bauen und bis 1987 zurückgehen? Ho ho.

Ok, keine snarky Kommentare mehr.

Wie finde ich heraus, wie die Konfigurationseinstellungen (z. B. Baudrate) aussehen sollten ...

Datenblatt lesen? OK OK. Im Ernst, letzter. Wenn Sie die Baudrate des Geräts, mit dem Sie kommunizieren möchten, nicht kennen, haben Sie zwei Möglichkeiten. Fangen Sie an zu raten oder brechen Sie möglicherweise ein O-Scope aus. Wenn Sie einen guten Ausgangspunkt benötigen, lassen Sie mich 9600-8-N-1 vorschlagen. Mein Verdacht ist, dass Sie relativ schnell mit brutaler Gewalt dorthin gelangen können. Es gibt eine dritte Möglichkeit, einen Ninja der alten Schule zu haben, der anhand des LOOK der verstümmelten Charaktere bei einer Standard-Baudrate erkennen kann, wie hoch die tatsächliche Baudrate ist. Ein beeindruckender Partytrick, um sicher zu sein.

Hoffentlich haben Sie Zugriff auf diese Informationen. Unter Unix / Linux können Sie Minicom erwerben, um direkt mit der seriellen Schnittstelle zu spielen. Dies sollte es ziemlich schnell machen, die Konfiguration herauszufinden.

eine der wichtigsten Unix-Shells

Unter Unix sind die seriellen Ports dem Dateiverzeichnis / dev / zugeordnet. ttyS0 zum Beispiel. Wenn Sie die richtige Baudrate einstellen und nicht Minicom verwenden, können Sie sogar Daten in diese Datei kopieren, um sie dort zu versenden.

Auf das Fleisch der Frage können Sie 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 VERFÜGBAR)

Ich habe aber auch Interesse an der seriellen Programmierung mit Windows / Hyperterminal.

Hyperterminal und Minicom sind im Grunde das gleiche Programm. Ich überlasse diese Frage jemand anderem, wie Sie mit Windows auf die serielle Schnittstelle zugreifen können. Ich habe das in Windows seit den Win95-Tagen nicht mehr gemacht.

Quelle
Translate

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

Mein Rat: Verwenden Sie nicht das serielle E / A-Framework von Sun! Es ist von 1998 und voller Fehler. Sie können verwendenrxtxaber serialio ist besser!

Quelle
smh
Translate

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

  1. Verwenden Sie die von .NET bereitgestellte SerialPort-Klasse.
  2. Verwenden Sie die Win32-API. Es gibt eineumfangreicher MSDN-Artikelaus dem Jahr 1995 und viele kostenlose Bibliotheken und Beispiele im Internet, um Ihnen den Einstieg zu erleichtern.

Die .NET-Option wird viel einfacher.

Quelle
Translate

Wenn es plattformübergreifend sein muss, würde ich Boost empfehlenAsio.

Quelle
Translate

Bei der Arbeit verwenden wir Teraterm und Realterm, um zu überprüfen, ob die seriellen Daten korrekt formatiert sind. Außerdem haben wir einen Hardware-Splitter mit einem Switch, damit wir den Datenverkehr zu unserer Anwendung über ein Kabel zurück zu einem anderen Port überwachen können.

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

Quelle
Translate

Vor einiger Zeit habe ich eine Anwendung mit angemessener Größe geschrieben, um Verbindungen von einer Modemfarm zu einer TCP / IP-Netzwerkadresse weiterzuleiten.

Anfangs suchte ich nach einer unbelasteten (kostenlosen) seriellen E / A-Bibliothek. Ich habe Sun's, IBM's und RxTx ausprobiert. Sie waren für die Entwicklung der Anwendung und für die ersten Tests in Ordnung, aber in der Produktion erwiesen sie sich jeweils als instabil.

Schließlich habe ich für SerialPort von SerialIO bezahlt. Das Konvertieren war buchstäblich eine Übung beim Ändern von Importen, und die Bibliothek war es auchabsolutabsolut solide - ich kann es nicht genug empfehlen. Meine Anwendung wird seit einigen Jahren rund um die Uhr im Feld ausgeführt, ohne dass ein einziges Problem bei mehreren Kunden auftritt.

Wenn Sie mit der Entwicklung mit SerialPort beginnen, 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 verdammt vernünftig, solange Sie keine Software auf den Geräten für Ihre Kunden vorinstallieren.

Quelle
Translate

Von der anderen Seite, wenn Sie es mit C # tun möchten, das sowohl unter Windows als auch unter Linux ausgeführt wird - mit einigenEinschränkungen(BEARBEITEN: möglicherweise veraltet. Ich habe keine Möglichkeit, es zu testen.) Erstellen Sie einfach eineSerielle SchnittstelleObjekt, stellen Sie die Baudrate, den Port und andere ungerade Einstellungen ein, rufen Sie open auf und schreiben Sie Ihre Bytes [] aus. Nach all dem Setup verhält sich das SerialPort-Objekt sehr ähnlich zu jedem Netzwerk-Stream, daher sollte es einfach genug sein, dies herauszufinden.

Und wie ibrandy feststellt, müssen Sie alle diese Einstellungen wie die Baudrate kennen, bevor Sie überhaupt versuchen, mit einem seriellen Gerät zu kommunizieren.

Quelle
Translate

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

Im Allgemeinen ist es gut zu wissen, wie die Schnittstelle funktioniert. Sie können nicht kommunizieren, wenn die Baudrate nicht übereinstimmt, aber eine falsche Einstellung anderer Parameter kann funktionieren. Sie können beispielsweise problemlos Daten an das Gerät senden, wobei 1 Stoppbit mit 2 gesetzten Stoppbits erwartet wird. Probleme beginnen, wenn Sie in einem solchen Fall versuchen, Daten zu empfangen. Sie können das entsprechend gesetzte Paritätsbit auch als eines der Stoppbits usw. verwenden.

Quelle
Translate

Wenn Sie nicht gezwungen sind, einen bestimmten Compiler zu verwenden, empfehle ich die Verwendung von Qt. In der neuen Version 5.3 finden Sie eine Klasse für serielle Schnittstellen:

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

Der Code, den Sie schreiben, wird auf allen unterstützten Qt-Plattformen ausgeführt, zumindest auf solchen mit seriellen Schnittstellen.

Quelle
Translate

Ich habe purejavacomm verwendet:Es ist eine Implementierung von javax.comm, geschrieben in reinem Java + JNA

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

Sie können erwarten, dass eine reine Java-Bibliothek in der Leistung hinter einer nativen Implementierung wie rxtx zurückbleibt. Bei modernen CPUs ist es jedoch sehr wahrscheinlich, dass der Engpass die Bitrate Ihrer seriellen Schnittstelle und nicht die CPU-Zyklen ist. Außerdem ist das Debuggen viel einfacher als bei einer gemischten Java / Native-Bibliothek oder rein kompiliertem nativem Code.

Quelle