Moin,
habe einen Arduino, mit dem ich Daten über USB ausgebe.
Das mache ich mit
Serial.begin(9600);
Serial.println("Text");
Beim Anschließen des Arduino an den Windows-PC wird ein virtueller Port
COM12 eingerichtet.
Wenn ich in der Arduino-IDE den seriallen Monitor öffne, wird die
Ausgabe dort auch angezeigt.
Wenn ich aber ein anderes Terminal-Programm nehme (HTerm, Termite, Br@y,
Putty), dort COM12 wähle, wird nichts angezeigt.
Ich weiß, dass keine zwei Programme gleichzeitig auf den COM12-Port
zugreifen können, das wird auch mit einer Fehlermeldung quittiert.
Wenn die Arduino-IDE beendet wird, klappt das immer noch nicht. Auch
nicht nach einem Reset des Arduino oder einem Neustart des PC.
Vielleicht weiß ja hier jemand, woran das liegen kann.
Danke schon mal.
Gruß
Maxim
Maxim schrieb:> Baudrate und Format (Daten- u. Stop-Bits, Parity) sind natürlich richtig> eingestellt.
Dann funktioniert das natürlich auch.
Zumindest bei mir mit Putty und "Joy-it" Uno-R3 sowie MEGA-2560 des
gleichen Herstellers/Importeuers..
Es ging mir übrigens nicht darum einen bestimmten Hersteller
hervorzuheben. Aber es sind halt Teile mit dem "richtigen" Arduino
Com/USB-Chip ATmega16U2, nicht mit diesem 340 Dingens oder so...
tty schrieb:> Aber es sind halt Teile mit dem "richtigen" Arduino> Com/USB-Chip ATmega16U2, nicht mit diesem 340 Dingens oder so...
Das geht aber auch mit diesem 340 Dingens!
Das geht mit allen.
Für manche Schnittstellenbausteine ist ein extra Treiber nötig.
Wenn Arduino selber damit umgehen kann, dann ist das schon erledigt,
Und die anderen Terminalprogramme können auch damit umgehen.
Ach ja...
Die Arduino IDE macht beim Öffnen einen Reset des Arduino.
Das, und nur das, machen nicht alle anderen Terminal Programme.
bzw. kann man bei denen weg konfigurieren.
Helmut -. schrieb:> Das geht aber auch mit diesem 340 Dingens!
Mag sein.
Aber ich habs damit nie probiert weil sich die Teile sowieso schon immer
etwas bockig anstellen und beispielsweise öfter mal (beim neu verbinden)
die Nummer des com-ports ändern.
tty schrieb:> weil sich die Teile sowieso schon immer> etwas bockig anstellen und beispielsweise öfter mal (beim neu verbinden)> die Nummer des com-ports ändern.
Nur, wenn du mehrere davon hast.
Win entscheidet in erster Linie anhand der PID/VID und in zweiter Linie
anhand der Seriennummer, welcher COM vergeben wird.
Die Arduinos mit 16U2, 8U2 oder 32U4 haben eine Seriennummer
Win kann also die CH340 nicht unterscheiden.
Der Arduino ist ein originaler Leonardo.
Ich habe jetzt eine LED angesteckt, die während der Ausgabe leuchtet.
Sie leuchtet beim seriellen Monitor der Arduino-LED und auch bei andern
Terminals. Nur wird bei denen nach wie vor nichts ausgegeben.
Die Einstellungen wurden auch nochmal geprüft:
8 Bit Daten
1 Stop Bit
kein Parity
Bei der Reihenfolge PC-Neustart, Reset Arduino, Arduino-IDE, anderes
Terminal wurde inzwischen fast alles ausprobiert, immer das gleiche
Ergebnis.
Maxim schrieb:> Der Arduino ist ein originaler Leonardo.
Das hat auch was gedauert!
Warum nicht sofort.
> Reset Arduino
Dann meldet er sich zu erst mit dem Bootloader
Danach mit der Serial COM.
Der Leonardo ist also mit 2 COM Pots unterwegs.
Beim Leonardo ist die Baudrate übringens völlig egal.
Einzig 1200 Baud macht eine Extrawurst.
Maxim schrieb:> Bei der Reihenfolge PC-Neustart, Reset Arduino, Arduino-IDE, anderes> Terminal wurde inzwischen fast alles ausprobiert, immer das gleiche> Ergebnis.
RX und TX sind auch gekreuzt angeschlossen?
Oh, ist der Leonardo da anders als der Uno?
Jedenfalls, wird in der Arduino-IDE (serial monitor) COM12 angezeigt,
mit dem funktioniert das ja auch.
Wenn ich in den Terminals die verfügbaren Ports scanne, wird nur COM12
angezeigt.
Evtl. kommt der zweite Port erst dazu, wenn man die HDI-Funktion des
Arduino aktiviert, also wenn man ihn als Tastatur benutzt. Das ist
momentan (noch) nicht der Fall.
Maxim schrieb:> Oh, ist der Leonardo da anders als der Uno?
Ja!
Ja!
Und nochmal Ja!
Beim Leonardo und Micro muss man in Putty und Termite die Hardware Flow
Control (DSR/DTR) aktivieren.
Die Einstellung der Baudrate spielt dagegen keine Rolle da die Serielle
beidseitig rein virtuell ist.
Einzig 1200 Baud macht eine Extrawurst(Reset).
tty schrieb:> Aber ich habs damit nie probiert weil sich die Teile sowieso schon immer> etwas bockig anstellen und beispielsweise öfter mal (beim neu verbinden)> die Nummer des com-ports ändern
Damit hatte ich bisher weder unter Linux noch unter Windows Probleme.
man muss ihn natürlich immer an den selben USB Port stecken (gilt auch
für Hubs).
Ganz rund läuft es aber immer noch nicht.
Wenn ich den Arduino aus- und wieder einstecke (USB-Kabel) oder ein
Reset mache (Reset-Taster), höre ich das Windows Ding-Dong für Trennen
und Verbinden eines USB-Geräts. Soweit gut.
Der Arduino läuft aber nicht los, die LED bleibt dunkel.
COM12 wird vom Terminal-Programm zwar gefunden, es kommt aber keine
Ausgabe.
Wenn ich dann den seriallen Monitor der Arduino-LED starte, beginnt die
LED zu blinken, Ausgabe kommt.
Erst dann kann ich zum Terminal wechseln und dort die Ausgabe sehen.
Warum startet der Arduino erst, wenn der serielle Monitor der IDE
aufgerufen wird? Kann ich das auch in einem Terminal hin bekommen?
OK, das Problem lag am Sketch. Dort ist ein
while(!Serial);
drin. Da passiert wohl irgendwas mit dem seriellen Monitor.
Wenn ich das auskommentiere, läuft der Sketch los (LED blinkt).
Ich bekomme am Terminal aber keine Ausgabe mehr.
Irgendwie ist das verhext...
Maxim schrieb:> Wenn ich den Arduino aus- und wieder einstecke (USB-Kabel) oder ein> Reset mache (Reset-Taster), höre ich das Windows Ding-Dong für Trennen> und Verbinden eines USB-Geräts. Soweit gut.>> Der Arduino läuft aber nicht los, die LED bleibt dunkel.> COM12 wird vom Terminal-Programm zwar gefunden, es kommt aber keine> Ausgabe.
Wenn du das Gerät abziehst während eine Verbindung (softwareseitig)
offen ist, blockiert etwas. Du musst erst den Arduino Monitor (bzw. dein
Terminal Programm) schließen und es dann anstecken.
Danke, das habe ich aber beachtet. Erst Verbindung trennen, dann
abstecken.
HTerm und Br@y Terminal funktionieren nicht.
Termite geht.
Vielleicht kommt es darauf an, wie so ein Terminal-Programm den Port
öffnet.
Maxim schrieb:> Ich bekomme am Terminal aber keine Ausgabe mehr.
Probiere mal im Terminalprogramm aus, das DTR Signal zu ändern. Notfalls
auch RTS.
Vielleicht gibst du mal unmissverständlich bekannt, um welches Arduino
Board es geht.
Maxim schrieb:> Es ist ein Arduino Leonardo, die originale Version.
Der hängt direkt am USB, also gibt es keine Hardware Handshake
Leitungen. Sein Schaltplan nützt hier nichts.
Aber das verwendete USB Protokoll emuliert sie, und so kann die Software
auf dem Chip durchaus den den Hardware Handshake Signalen abhängen.
Also schauen wir in die Doku:
https://www.google.com/search?q=arduino+leonardo+serial
Das erste Ergebnis ist bei mir
https://www.arduino.cc/en/Guide/ArduinoLeonardoMicro
Und da steht, dass dieses Board (wie oben bereits angemerkt wurde) beim
Öffnen des seriellen Portes keinen Reset macht und dass es stehen
bleibt, wenn der Puffer voll ist. Der Befehl
1
while(!Serial);
Wartet darauf, dass der PC eine Verbindung aufbaut. Dein Programm wird
dann allerdings ohne PC also nicht lauffähig sein. Eine etwas klügere
Lösung mit Timeouts oder einem if/else (nur etwas ausgeben, wenn
Verbindung besteht) wäre da vielleicht klüger.
Weiterhin habe ich Google ganz schnell diese Seite gefunden:
https://forum.arduino.cc/index.php?topic=119557.0
Da steht "The leonardo only sends out data if the program/os on the pc
sets either DTR or RTS, (or both) high. If you use a program like putty
or the serial monitor in the IDE to communicate with the leonardo, there
is no problem because these programs set DTR and/or RTS. If you do
serial communications from your own program you must make sure yourself
to set DTR/RTS. "
Was meine weiter oben geäußerte Vermutung bestätigt. Die Ansteuerung der
(virtuellen) DTR und RTS Leitung ist dein Knackpunkt.
Maxim schrieb:> OK, das Problem lag am Sketch. Dort ist ein> while(!Serial);> drin. Da passiert wohl irgendwas mit dem seriellen Monitor.
Nöö..
Der Leonardo wartet, bis die Serielle geöffnet wird.
(Serial implementiert den bool Cast Operator)
Für Putty muss das Handshake dann auf RTS/CTS stehen
Termite hätte es gerne mit DTR/DSR
TeraTerm da reicht Hardware Handshake
Um das abzuschließen:
Die serielle Schnittstelle des Arduino Leonardo funktioniert jetzt wie
erwartet. Am liebsten benutze ich das Br@y-Terminal. Da muss man kein
Handshake einstellen (RTS/CTS). Es genügt, wenn man unten den Button DTR
aktiviert.
Also, vielen Dank für eure Hilfe!