Forum: PC-Programmierung JAVA Comm Api zu langsam


von Stefan Heindel (Gast)


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

von Chris (Gast)


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.

von ape (Gast)


Lesenswert?

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

von Sebastian Schildt (Gast)


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

von Sebastian Schildt (Gast)


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!

von T.Stütz (Gast)


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

von Alex (Gast)


Lesenswert?

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

von Stefan Heindel (Gast)


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.

von Rufus T. Firefly (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.