www.mikrocontroller.net

Forum: PC-Programmierung JAVA Comm Api zu langsam


Autor: Stefan Heindel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Java Programm, welches über die serielle Schnittstelle
Daten an einen Mikrocontroller senden soll. Diese Software funktioniert
auch recht gut, allerdings ist die Übertragung zu langsam. So dauert das
senden von 1000 Zeichen ~100µs, "rechnerisch" kommt man allerdings auf
einen theoretischen Wert von 70-80µs (@115kbits). Komisch ist außerdem,
dass die Zeiten auch locker auf das doppelte ansteigen, wenn man eine
Anwendung (z.B. Skype) nebenbei benutzt.
Mein PC hat 900MHz, und eigentlich sollten Daten an den COM-Port
schicken keine große Belastung sein, aber der komplette PC ist während
des Sendevorgangs nahezu eingefroren.

Zur Software selbst:
Die Software schreibt die zu sendenden Daten in ein Array, welches
danach Byte für Byte gesendet wird. Zuerst wurde die COMM-Api von Java
benutzt, später wurde dann die Lösung von RXTX.org ausprobiert. Leider
aber gab es kaum eine Verbesserung.

Gibt es eine Möglichkeit, der Sache beizukommen?

Grüße

Stefan

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenn mich mit der Java-API nicht aus, aber sendest du wirklich jedes
Byte einzeln? Zumindest in der WinAPI ist es geschickter, die Daten in
größeren Einheiten an die COM-API zu übergeben.

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du die Zeichen alle einzeln sendest ist das normal, versuch mal ein
Array als Übertragungsbuffer zu verwenden.

Autor: Sebastian Schildt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Allerdings sollte der PC nicht "nahezu eingefroren" sein. Falls du die
JAvaComm Impl von Sun verwendest, versuch alternativ mal die:
http://rxtx.org/. Das scheint mir besser gepflegt zu sein. Das es
schneller geht wenn man nicht immer nur einzelnen Bytes schreibt gilt
natürlich trotzdem.

Ich empfehle die 2.1xxx Versionen wo drüber steht "For use without
Sun's CommAPI (namespace gnu.io)", weil man dann wirklich nur die
Packages von rxtx.org installieren muss und nicht zusätzlich das comm
package von Sun braucht. Die API ist exakt gleich nur das man statt
javax.comm jetzt gnu.io. schreiben muss

Autor: Sebastian Schildt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, habe nich gelesen das du das schon getestet hast. IS wohl schon
zu spät. Naja wer nicht lesen kann mus sich halt die Finger wund tippen
:)

Gute Nacht!

Autor: T.Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hast du das genau gerechnet ?

115200 Baud, 8 Datenbits, 1 Stopbit,1Startbit , 1 Parität
um 1000 Zeichen zu übertragen brauchst du dann

1000 * (8+1+1+1) mal 1/115200 = 95.4us

was ungefähr deinen 100us entspricht.

Das durch andere Software dieser Wert nach oben wandert
ist auch klar, da Windoof dein Programm unterbricht sodaß bei
Einzel-Byte-Übertragung diese Zeit dazu kommt.
Bau es auf Blockuebertragung um dann ist die Performance besser.

Gruss

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht zu vergessen, dass zwischen zwei Byte die Line eine bestimmte Zeit
H-Pegel haben muss, steht alles in den Specs.

Autor: Stefan Heindel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, um ehrlich zu sein bin ich davon ausgegangen dass es sich bei den
115kbits um Nettodaten handelt :-/

Mit der Blockweisen Geschichte muss ich mich mal auseinandersetzen.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex: Du beschreibst das Stopbit.

@Stefan: 115200 ist die Bruttodatenrate. Verzichtet man auf das
Paritätsbit (8n1), so werden je übertragenes Byte 10 Bits versendet,
die maximal erzielbare Übertragungsrate liegt so bei 11520 Bytes/sec,
was einer Byteübertragungsdauer von knapp 87 µS entspricht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.