Hallo,
an der FH habe ich ein Projekt am laufen, mit dem ich per GPS ein Fahrzeug über USB steuer. Da ich windows XP und Java verwende, habe ich mir die „Java communication API“ geholt, mit der ich die Verbindung zum Port aufbau.
Ich sende einen String (S motorID geschw -> S 0 18) an meinen Port, der per USB die Daten zu einer kleinen Platine (MiniBoard von qfix) leitet.
Aber irgendwie sendet er nicht die kompletten Daten (zumindest in 99% der Fälle). Das MiniBoard ist so programmiert, dass es zurückgibt, was es empfangen hat. Wenn es einen Fehler bei der Übertragung festgestellt hat (Falscher String, oder unkompletter String) dann sendet es ERROR zurück.
Ich habe festgestellt, sobald er einmal dann richtig die Daten empfangen hat, läuft das Programm ohne Probleme weiter… (Dahin bin ich erst 2 mal gekommen seit 2 Wochen)
Mit HyperTerminal kann ich auch die Strings komplett rübersenden.
Dafür muss ich aber in den Einstellungen unter ASCII-Konfiguration den Haken bei „Gesendete Zeilen enden mit Zeilenvorschub“ setzen. (Hat uns der Projektbetreuer gesagt, der auch das MiniBoard herstellt).
Kann mir jemand sagen, wie ich einen „Zeienlenvorschub“ in Java sende?
Wenn es das \n oder das \r ist, habe ich wohl schon alles ausprobiert.
Aber das, was mich wundert ist folgendes:
Am Donnerstag Abend habe ich das Senden der Strings versucht, und alles hat Tadellos geklappt (nach dem ich „Zünden“ gedrückt habe… dazu später).
Als ich es dann meinem Lehrer am Freitag morgen (ohne CodeÄnderung) zeigen wollte, lief es nicht mehr (von 9 - 14 Uhr). Trotz ununterbrochenem „Zünden“.
Dieses „Zünden“ ist bei mir eine Funktion, die so lange einen String sendet, bis 50 mal kein ERROR zurückgekommen ist.
Mir ist aufgefallen, dass wenn ich immer wieder das gleiche Signal sende, irgendwann mal das richtige am MiniBoard ankommt. Wenn dann einmal das richtige angekommen ist, kommen die nachfolgenden Strings fast immer auch richtig an.
Darum ist die „Zünden“ Methode da, die eine Variable von 50 runter zählt, und so lange den gleichen String sendet bis die Variable bei 0 ankommt. Falls ein ERROR zurückkommt, wird die Variable wieder auf 50 gesetzt.
Dadurch erreich ich, dass ich mir nahe zu sicher sein kann, dass die folgenden Strings auch richtig übertragen werden.
Was mir noch aufgefallen ist bei der Zurücksendung der empfangenen Daten (Antwort von MiniBoard an PC):
Wenn ich einen String sende z.B. S 0 18, dann sendet mir das MiniBoard manchmal zurück, dass ich nur „S 0 1“ oder auch manchmal " 0 18", oder auch „0 18 S“ gesendet Hätte… Kann das an einem Puffer liegen?
Fragen:
- Wie sendet man einen Zeilenvorschub (außer \n oder \r)?
- Kann es sein, dass ein Puffer, falsch ist, der dann unkomplette Daten überträgt?
Ich werde in ca. 1 Stunde hier mal den QuellCode von meiner Datei geben, die mit dem MiniBoard kommunizieren sollte.
Danke schon mal für die Hilfe