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
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.
Wenn du die Zeichen alle einzeln sendest ist das normal, versuch mal ein Array als Übertragungsbuffer zu verwenden.
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
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!
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
Nicht zu vergessen, dass zwischen zwei Byte die Line eine bestimmte Zeit H-Pegel haben muss, steht alles in den Specs.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.