Hi, ich hab hier einen Arduino micro, und hab eine Kommunikation laut Beispiel http://playground.arduino.cc/Interfacing/Java eingerichtet, jetzt kann ich zwar werte mit dem Hyperterminal empfangen aber nicht mit meinem Programm. Senden geht. Das selbe Programm unter Linux funktioniert auch in beiden Richtungen. Wo liegt mein fehler??
:
Verschoben durch User
Hi Könntest du das nochmal genauer erklären. Du meinst, wenn das Beispielprogramm auf dem Arduino ist, dann empfängst du was, aber wenn dein selber geschribenes Programm drauf ist nicht? Vielleicht noch einmal ganz ausführlich und klar hinschreiben;) Noch als Programmtipp: Ich benutze immer hTerm: http://www.der-hammer.info/terminal/ Finde ich sehr gut. Aber das musst du entscheiden. Siehs dir mal an;)
So wie ich das verstehe, wird auf dem PC entweder ein Terminalprogramm verwendet, das Daten empfangen kann, oder ein selbstgebautes Java-Programm, das nur dann Daten empfangen kann, wenn es unter Linux läuft, aber nicht unter Windows. Der Fehler wird dann wohl in der Ansteuerung der seriellen Schnittstelle auf dem PC liegen, nicht auf dem Arduino (was weiß der davon, was am anderen Ende des Seriellen Kabels lauert? Eben: Nichts).
Also, auf dem Arduino läuft ein einfaches Programm, das sende jede sekunde eine zahl, und schaltet bei befehl "ein" einen ausgang. Ich habe das Java Programm aus dem Arduino Playground genommen und erst mal geschaut ob ich was lesen kann, unter Linux geht es, unter Windows nicht, daraufhin hab ich den Hyperterminal gestartet und mit den selben einstellungen "COM2" 9600 8N1 die werte vom Arduino bekommen. Daraufhin hab ich das Java Programm unter Linux so geändert das ich den Ausgan mit dem Befehl an/und ausschalten kann. dasselbe dann in Windows gestartet, daraufhin konnte ich den Ausgan schalten, aber keine Werte empfangen.
Bitte mal konkrete Beispiele. Der Beispielcode nutzt z.B. gebufferte Streams, eventuell hängt da unter Windows was im Buffer. Auch müssen alle Zeilen per \r\n abgeschlossen sein.
Es wird ja unter Windows noch nicht einmal der SerialPortEventListener aufgerufen.
1 | try { |
2 | serialPort.addEventListener(new serialPortEventListener()); |
3 | } catch (TooManyListenersException e) { |
4 | out.e("TooManyListenersException für Serialport"); |
5 | } |
6 | serialPort.notifyOnDataAvailable(true); |
...
1 | class serialPortEventListener implements SerialPortEventListener { |
2 | public void serialEvent(SerialPortEvent event) { |
3 | out.d("serialPortEventlistener"); |
4 | switch (event.getEventType()) { |
5 | case SerialPortEvent.DATA_AVAILABLE: |
6 | serialPortDatenVerfuegbar(); |
7 | break; |
8 | case SerialPortEvent.BI: |
9 | case SerialPortEvent.CD: |
10 | case SerialPortEvent.CTS: |
11 | case SerialPortEvent.DSR: |
12 | case SerialPortEvent.FE: |
13 | case SerialPortEvent.OUTPUT_BUFFER_EMPTY: |
14 | case SerialPortEvent.PE: |
15 | case SerialPortEvent.RI: |
16 | default: |
17 | } |
18 | } |
19 | } |
wie gesagt das senden funktioniert.
Hendrik Leuchtemann schrieb: > Es wird ja unter Windows noch nicht einmal der SerialPortEventListener > aufgerufen. Na und? Der wird auch nur aufgerufen wenn (nach Meinugn des Treibers) Daten vorliegen, falls die Schnittstelle puffert dauert es ggf. (zu) lange. Das Eventbasierte Lesen ist meiner Meinung nach auch nicht so optimal für eine Streamkommunikation, mach doch mal versuchsweise einen Thread der blockierend direkt vom Inputstream liest.
da kommt auch nichts. Was ist den Optimal für Eventbasiertes Lesen?
Normalerweise blinkt die Tx LED am Arduino wenn er sendet (wenn das Port offen ist) macht sie aber nicht.
Zeig doch mal dein ganzes Testprogram. Das senden des Arduino sollte vollkommen unbeeindruckt davon sein ob überhaupt was angeschlossen oder "verbunden" ist, auf welchen Trigger hin sendet der den was?
1 | if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { |
2 | try { |
3 | String inputLine=input.readLine(); |
4 | System.out.println(inputLine); |
...das sieht für mich problematisch aus: Was ist wenn der Puffer noch gar keinen Zeilenumbruch enthält? (k.A. wie sich Java da verhält) Was wenn man bei Data-Available einfach mal ne Messagebox anzeigt oder dort nen Haltepunkt setzt? Geht er da jemals rein?
nein, da geht er nicht rein, wenn ich die if abfrage auskommentiere sagt er mir das readline 0 daten enthält.
Was man noch machen könnte wäre mit setFlowControlMode() rumspielen: Einige CDCs benötigen z.B. seltsamerweise explizit FLOWCONTROL_RTSCTS_IN und FLOWCONTROL_RTSCTS_OUT
mit dem FlowControl bringt auch nichts, ich hab das programm auch mal auf einem anderem Windowsrechner ausprobiert, da ist das selbe Problem.
Hendrik Leuchtemann schrieb: > Anbei das Arduino programm und das Java Programm. Bitte einmal als Zip, sodass man das auch ohne Spezialsoftware lesen kann... bluppdidupp schrieb: > ..das sieht für mich problematisch aus: Was ist wenn der Puffer noch gar > keinen Zeilenumbruch enthält? Dann blockiert der dort... Deshalb ist der Eventbasierte Ansatz hier auch komplett für den Abfalleimer.
Läubi .. schrieb: > Bitte einmal als Zip, sodass man das auch ohne Spezialsoftware lesen > kann... Für Windows ist hier 7zip zu empfehlen, das kann das. Und gegenüber der windows-eigenen Zip-"Unterstützung" ist es sowieso zu bevorzugen. Auf dem Mac ist z.B. BetterZip ein gutes Äquivalent.
Möglich aber warum sollte ich die Hürde für Leute die freiwillig Helfen wollen noch extra hoch setzen ohne Vorteil.
Naja, soooo exotisch ist RAR jetzt auch wieder nicht. Im Zweifelsfall sollte man aber lieber das Format mit der größeren Verbreitung nehmen, da hast Du schon Recht. Und eine einzelne Datei komm_test.ino mit einer Größe von unter einem KB noch zu packen, wo die Datei schon auf einem üblichen Datenträger mehr Platz belegt als sie Bytes hat, egal ob gepackt oder ungepackt - das wiederum ist exotisch. ;-)
:
Bearbeitet durch User
Mark Brandis schrieb: > Naja, soooo exotisch ist RAR jetzt auch wieder nicht Naja, es ist einfach ein proprietäres Format mit dem man nur Ärger hat (Versionsinkomptibilitäten, defekte Archive noch und nöcher, 'eigentlich' darf nur der Erfinder Kompressionsprogramme bereitstellen, ....) und ich muss halt extra Software installieren.
Ich hatte ehrlich gesagt noch nie Probleme mit rar. Die Wiederherstellungsinformationen waren damals zu Modem/ISDN-Zeiten ein Segen gegenüber zip.
Rufus Τ. Firefly schrieb: > Für Windows ist hier 7zip zu empfehlen, das kann das. Und gegenüber der > windows-eigenen Zip-"Unterstützung" ist es sowieso zu bevorzugen. Ich habe mit 7-zipp arge Probleme. Eines morgens stellte ich meinen Rechner an und da ging nix mehr mit 7zip, nachdem ein neues Windows-Patch eingespielt worden war. Danach machte ich die Aktualisierung rückgängig und alles war nicht mehr wie früher. Das 7zip war einfach nicht mehr da, es hatte sich verpflüchtigt und später im Toaster versteckt. Ich stellte den Toaster zum Frühstück an und hatte gezippte Brote. So nen Kääs.
bluppdidubb schrieb: > Das 7zip war einfach nicht mehr da, es hatte sich > verpflüchtigt und später im Toaster versteckt. Und Du nimmst an, daß die Ursache solcher Probleme tatsächlich 7zip sein soll?
> Ich habe >das Java Programm aus dem Arduino Playground genommen und erst mal >geschaut ob ich was lesen kann, unter Linux geht es, unter Windows >nicht, daraufhin hab ich den Hyperterminal gestartet und mit den selben >einstellungen "COM2" 9600 8N1 die werte vom Arduino bekommen. Daraufhin >hab ich das Java Programm unter Linux so geändert das ich den Ausgan mit >dem Befehl an/und ausschalten kann. dasselbe dann in Windows gestartet, >daraufhin konnte ich den Ausgan schalten, aber keine Werte empfangen. Mit diesem Problem hatte ich vor ca. 3/4 Jahren auch mal eine Zeitlang gekämpft. Wenn ich recht erinnere, war es ein Fehler in RxTx. Die Einstellung der Handshake-Leitungen wir bei Windows und Linux unterschiedlich interpretiert. Den genauen Ort kann ich Dir nicht mehr sagen. Es sollte helfen, mit den Einstellungen zu spielen oder einen Demo Code von RxTx für Windows zu suchen.
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.