Bash, serielle I/O und Arduino
So, ich bin in ein bisschen über meinen Kopf, und ich fühle mich wie ich bin sehr nahe an einer Lösung, aber es funktioniert einfach nicht ganz. Hier ist meine situation:
Ich arbeite mit einem Arduino-mikrocontroller, und ich bin versucht zu schreiben, zwei Bash-Skripte (jetzt mit Mac OS X 10.6), die (a) drucken alle seriellen Daten kommen aus dem Arduino-Einheit, um die standard-Ausgabe, und (b) lassen Sie mich senden von seriellen Daten an das Arduino-Einheit. Diese Skripte werden dann aufgerufen werden, mithilfe von Adobe AIR NativeProcess-API ermöglichen eine nahtlose integration zwischen der Arduino-Gerät und eine Flex Adobe AIR Anwendung.
Meine beiden Skripte sind sehr einfach -
Hier ist meine WriteToSerial.sh Skript:
echo $1 > $2
($1 ist natürlich mein string, $2 ist die Lage des serial-port - derzeit /dev/tty.usbserial-A800eIUj)
Und hier ist meine ReadSerialOutput.sh Skript:
tail -f $1
($1 ist die Lage meiner seriellen port, derzeit /dev/tty.usbserial-A800eIUj)
Wenn ich eines der beiden Skripte (oder auch wenn ich nur geben Sie die Befehle direkt in die Bash-Konsole), mein computer hängt - ich kann Zeichen eingeben, aber es passiert nichts, bis ich die Strg + C aus dem Prozess.
Allerdings, wenn ich öffnen Sie die Arduino-IDE und schalten Sie den Seriellen Monitor, dann tail -f
den port, schließen Sie den seriellen monitor und dann echo "test" > Seriell-port, alles funktioniert einfach toll.
Dies lässt mich vermuten, dass das öffnen des Serial Monitor in der Arduino IDE ist irgendwie initialisieren der seriellen Schnittstelle, was wiederum ermöglicht es mir, mich Schwanz es kein problem. Dies wiederum lässt mich vermuten, dass ich bin einfach zu fehlerhaften Eingabe eine Art Initialisierungs-Befehl. Jedoch, ich habe lange gesucht hoch und niedrig für Tage und kann nicht scheinen, nichts zu finden, der dieses Problem behebt.
Was ist die Lösung?
- Das sollte ich hinzufügen - ich habe versucht, mit "stty -F /dev/tty.usbserial-XXXXX", aber ich bekomme "stty: illegal option -- -F" - das klingt nicht richtig für mich.
- OK, also ich hab jetzt gelernt, dass -F und-Datei aus irgendeinem Grund nicht in meinem OS aber, dass "-f" funktioniert - also mache ich das, und immer noch keine Würfel.
- Möglicherweise möchten Sie bitten, diese Frage auf electronics.stackexchange.com, Sie beschäftigen sich mit Fragen rund um Arduinos und embedded-Programmierung.
- Seit tail ist immer zu laufen, bis Letzte Zeile, die erscheint nicht, bis serial bus geschlossen ist, finden Kopf sehr nützlich
head --lines 1 < /dev/ttyUSB0
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen mit dem tool stty:
Als immer, Lesen Sie die manpage, bevor die oben genannten.
cread
ermöglicht es Ihnen, Daten zu empfangen. Möchten Sie vielleicht weglassenclocal
wenn Sie mit Flusskontrolle. Wenn Sie nicht sicher sind, was die oben genannten Einstellungen sind, Fragen Sie, und ich kann schreiben, bis eine vollständige Antwort.stty -a < /dev/tty.usbserial-A800eIUj
während Sie den seriellen port arbeiten auf der Arduino-IDE? Geben Sie die Einstellungen zu verwenden.Bekomme ich das gleiche problem auch. Ich nutze einen Arduino Uno mit Ubuntu 12.04. Nach ein paar Stunden suchen und ausprobieren fand ich heraus, dass Arduino wird reset, wenn das serielle Gerät wird geöffnet zum ersten mal,aber nicht zurückgesetzt wird, wenn das serielle Gerät ist wieder geöffnet.
So, run-Befehl - echo "input string" > /dev/ttyXXX in der bash wird zurückgesetzt Arduino und senden "input string" sofort. Arduino braucht einige Zeit dauern, um zu initialisieren, und ist nicht schnell genug, um erhalten diese Zeichenfolge. cat /dev/ttyXXX wird zurückgesetzt Arduino auch.
Wenn /dev/ttyXXX ist eröffnet irgendwo Erstens, diese Befehle funktionieren wird.
Hier ist meine Lösung:
1) open /dev/ttyXXX durch die Umleitung von /dev/ttyXXX Datei-Beschreibung 3
2) warten, bis Arduino Initialisierung
3) die Kommunikation mit Arduino
4) schließen /dev/ttyXXX
Ich kämpfte mit diesem problem auch, Versuch kein Ende der stty-Einstellungen und tricks zu Katze meine Dateien auf /dev/tty.usbserial-FTF7YNJ5 (in meinem Fall), während das stehen auf einem Fuß, etc.
Dann habe ich ein ls /dev und bemerkte wie /dev/cu.usbserial-FTF7YNJ5 -- ach, was ist das? Offenbar ein "Aufruf Einheit" version von dem Gerät nicht erwarten, oder geben Sie keine flow-control. Dumps bytes an den port. Genau das, was ich brauchte.
So einfach tun: Katze super_file.bin > /dev/cu.usbserial-XXXXX
Hoffe, das hilft. Und erst jetzt weiß ich die Antwort, fand ich dies: http://stuffthingsandjunk.blogspot.com/2009/03/devcu-vs-devtty-osx-serial-ports.html
Auf Linux, müssen Sie rufen Sie setserial konfigurieren serial port options (Baudrate, Parität, flow control, etc.) bevor Sie Lesen/schreiben der port korrekt.
Müssen Sie einen Weg finden, dies zu tun mit Ihrem Mac OS X Bash system.
Oder Sie könnten schreiben Sie ein Python-Skript, dies zu tun.
Vielleicht versuchen, einige serielle command-line-tool ähnlich wie serial-1.0.
Finden Sie unter: Serial-port-loopback - /duplex-test, bei Bash oder C? (process substitution)
Versuchen, das hinzufügen eines kaufmännischen und-Zeichens (&) an das Ende der Befehle, um den Prozess in den hintergrund. Wenn sich die Konsole aufhängt, dann bedeutet das, das Skript oder Prozess noch läuft auf Ihrem aktuellen terminal, und Sie werden nicht in der Lage sein, für die Eingabe oder klicken Sie auf nichts, bis der Prozess oder das Skript ausgeführt wird.
Können Sie auch versuchen, den Befehl ausführen im 1 terminal-Fenster, und öffnen Sie ein neues terminal-Fenster/tab, und versuchen tailing von dort.
Versuchen /ändern ttyecho:
http://www.humbug.in/2010/utility-to-send-commands-or-data-to-other-terminals-ttypts/
Überprüfen, um zu sehen, ob die übertragung der Daten zum /empfängt Daten vom Arduino-Einheit arbeitet durch die Verwendung einer anderen app wie Cornflake (serielles terminal für Mac OS X) - statt mit der Arduino IDE & den Serial Monitor.
Darüber hinaus können Sie prüfen wollen, ob Sie könnte ein Umstieg auf Xcode (in Bezug auf debugging-Funktionen, etc.).
Finden Sie unter: Einrichten von Xcode zu Kompilieren & Hochladen auf einem Arduino ATMega328 (Duemilanove)
Gibt es auch von Apple SerialPortSample Kommandozeilen-tool, mit dem Sie beliebige Baudraten:
Weitere Informationen finden Sie unter: http://www.arduino.cc/playground/Interfacing/Cocoa
Weiteres Stück Cocoa sample code, zeigt Ihnen, wie mit dem Arduino-mikrocontroller über eine serielle Verbindung ist Ziel-candarduino (gehostet auf Google code).
Einen one-liner Etwas, das funktioniert wirklich gut für datalogging und handeln auf Daten:
Zusammenfassung
die folgenden Zeitstempel und sendet Sie an stdout
Beispiel-Ausgabe:
Diese Methode kann auch angepasst werden, um zu überwachen und zu handeln auf die Daten in Echtzeit:
mehr Beispiele hier:
https://github.com/gskielian/Arduino-DataLogging/tree/master/Bash-One-Liner