JAVA Comm Api zu langsam

Gast #200919
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
Gast #200920
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.
Gast #200922
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
Gast #200924
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
Gast #200927
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren