it-swarm.com.de

Bash, serielle E / A und Arduino

Quindi sono un po 'sopra la mia testa und mi sento molto vicino a una soluzione, ma non funziona ancora abbastanza. Ecco la mia situazione:

Sto lavorando con un microcontrollore Arduino und sto tentando di scrivere due script Bash (oder in einer Ausgabe unter Mac OS X 10.6) für (a) die Ausgabe der Seriennummer und der Standardausgabe von Arduino sullo, und (b) mi consente di Inviare Dati Seriali All'unità Arduino. Das Skript wurde für den NativeProcess von Adobe AIR erstellt und ist für die Anwendung von Flex Adobe AIR einverstanden.

Ich miei due script sono molto semplici -

Ecco il mio script WriteToSerial.sh:

echo $1 > $2

($ 1 ist die übliche Gebühr, $ 2 die übliche Gebühr - attualmente /dev/tty.usbserial-A800eIUj)

Ed ecco il mio script ReadSerialOutput.sh:

tail -f $1

(1 US-Dollar in der Reihenfolge des Eingangs, Bestätigung /dev/tty.usbserial-A800eIUj)

Quando chiamo uno di questi script, il mio computer si blocca - Posso digitare caratteri, ma non succede nulla finché nonCtrl+Cfuori dal processo.

Tuttavia, se apro Arduino IDE e accendo il monitor seriale, quindi tail -f la porta, chiudi il monitor seriale, quindi echo "test"> porta seriale, tutto funziona alla grande.

Die Suche nach dem richtigen Monitor für ArduinoIDEist in der richtigen Weise durchgeführt worden, um das richtige Ergebnis zu erzielen. Questo a sua volta mi suggerisce che non sto semplicemente inserendo una sorta di comando di inizializzazione. Tuttavia, ho cercato in alto und in basso per giorni e non riesco und trovare nulla che risolva questo problema.

Qual'è la soluzione?

25
Myk

Versuchen Sie es mit dem Tool stty :

stty -F /dev/my_serial_port <baud_rate> cs8 cread clocal

Lesen Sie wie immer die Manpage, bevor Sie das obige anwenden. Mit cread können Sie Daten empfangen. Sie möchten möglicherweise clocal weglassen, wenn Sie die Flusssteuerung verwenden. Wenn Sie sich nicht sicher sind, was die obigen Einstellungen sind, fragen Sie und ich kann eine vollständigere Antwort aufschreiben.

14
J. Polfer

Ich habe auch das gleiche Problem. Ich benutze Arduino Uno mit Ubuntu 12.04. Nach einigen Stunden des Suchens und Versuchens finde ich heraus, dass Arduino zum ersten Mal rücksetzen - das erste Gerät , -/, aber nicht zurückgesetzt wird, wenn das serielle Gerät wieder geöffnet wird.

Wenn Sie also den Befehl echo "input string">/dev/ttyXXX in der bash ausführen, wird Arduino zurückgesetzt und "input string" sofort gesendet. Arduino braucht etwas Zeit zum Initialisieren und ist nicht schnell genug, um diese Zeichenfolge zu erhalten. cat/dev/ttyXXX setzt auch Arduino zurück.

Wenn / dev/ttyXXX zuerst geöffnet wird, funktionieren diese Befehle.

Hier ist meine Lösung:

1) Öffnen Sie/dev/ttyXXX, indem Sie/dev/ttyXXX zur Dateibeschreibung 3 umleiten

exec 3 <>/dev/ttyXXX

2) Warten Sie auf die Initialisierung von Arduino

schlaf 1

3) mit Arduino kommunizieren

echo "etwas eingeben"> & 3

katze <& 3

4) Schließen Sie/dev/ttyXXX

exec 3> & -

28
Yihui Xiong

Ich kämpfte auch mit diesem Problem und versuchte mit allen möglichen Einstellungen und Tricks meine Dateien auf /dev/tty.usbserial-FTF7YNJ5 (in meinem Fall) zu katzen, während ich auf einem Zeh stand usw.

Dann machte ich ein ls/dev und bemerkte /dev/cu.usbserial-FTF7YNJ5 - oh, was ist das? Offensichtlich eine "rufende Einheit" -Version des Geräts, die keine Flusskontrolle erwartet oder bietet. Gibt Bytes an den Port aus. Genau das, was ich brauchte.

Also einfach: cat super_file.bin> /dev/cu.usbserial-XXXXX

Hoffe das hilft. Und erst jetzt, wo ich die Antwort kenne, fand ich Folgendes: http://stuffthingsandjunk.blogspot.com/2009/03/devcu-vs-devtty-osx-serial-ports.html

4
chrism

Unter Linux müssen Sie setserial aufrufen, um die Optionen für den seriellen Port (Baudrate, Parität, Flusssteuerung usw.) zu konfigurieren, bevor Sie den Port richtig lesen/schreiben können.

Sie müssen einen Weg finden, um dies mit Ihrem Mac OS X Bash-System zu tun.

Oder Sie könnten ein Python-Skript schreiben , um dies zu tun.

2
J. Polfer

Versuchen Sie es mit einem seriellen Befehlszeilentool, das mit serial-1.0 vergleichbar ist.

Siehe: Serieller Port-Loopback/Duplex-Test in Bash oder C? (Prozessersetzung)

1
dan
0
tilo

Prüfen Sie anhand einer anderen App wie Cornflake (serielles Terminal für Mac OS X), ob das Senden von Daten an/das Empfangen von Daten von der Arduino-Einheit funktioniert, anstatt Arduino IDE und den seriellen Monitor zu verwenden.

Außerdem möchten Sie vielleicht herausfinden, ob Sie von einem Wechsel zu Xcode profitieren könnten (in Bezug auf Debugging-Funktionen usw.).

Siehe: Einrichten von Xcode zum Kompilieren und Hochladen auf einen Arduino ATMega328 (Duemilanove)

0
tol

Ein One-Liner Etwas, das funktioniert wirklich gut für das Datenprotokollieren und für die Verarbeitung von Daten:

  • monitoring: Die Arduino-Ausgabe kann Aktionen auf dem Computer auslösen
  • data-logging: speichert gleichzeitig diese Streaming-Daten in einer Datei
  • nicht geprüft? send-messages: Ich habe noch nicht versucht, Daten an das Arduino zu senden, aber siehe das zweite Beispiel. Möglicherweise kann eine Nachricht über einen Befehl cmdline an den seriellen Port gesendet werden.

die folgenden Zeitstempel und sendet an stdout

cat /dev/cu.usbmodem1421 | awk '{ for (i=0; i<NF; i++) printf $i + system("echo  , `date`")}'

Beispielausgabe:

enter image description here

Diese Methode kann sogar angepasst werden, um die Daten in Echtzeit zu überwachen und darauf zu reagieren:

cat /dev/cu.usbmodem1421 | awk '{ for (i=0; i<NF; i++) printf $i + system("echo , `date`)}'

weitere Beispiele hier: https://github.com/gskielian/Arduino-DataLogging/tree/master/Bash-One-Liner

0
gskielian

Fügen Sie am Ende der Befehle ein kaufmännisches Und (&) hinzu, um den Prozess in den Hintergrund zu stellen. Wenn die Konsole auflegt, bedeutet dies, dass das Skript oder der Prozess noch auf Ihrem aktuellen Terminal ausgeführt wird, und Sie können nichts eingeben oder auf etwas klicken, bis der Prozess oder das Skript abgeschlossen ist.

Sie können auch versuchen, den Befehl in einem Terminalfenster auszuführen, ein neues Terminalfenster/eine neue Registerkarte zu öffnen und von dort aus zu wechseln.

0
bm7150

Es gibt auch Apples SerialPortSample-Befehlszeilenprogramm, mit dem Sie beliebige Baudraten einstellen können:

// from: SerialPortSample/SerialPortSample.c
// ...
// Starting with Tiger, the IOSSIOSPEED ioctl can be used to set arbitrary baud rates
// other than those specified by POSIX. The driver for the underlying serial hardware
// ultimately determines which baud rates can be used. This ioctl sets both the input
// and output speed. 
// ...

Weitere Informationen finden Sie unter: http://www.arduino.cc/playground/Interfacing/Cocoa

Ein weiterer Teil des Cocoa-Beispielcodes, der Ihnen zeigt, wie Sie mit dem Arduino-Mikrocontroller über eine serielle Verbindung kommunizieren können, ist Objective-Standard (gehostet bei Google-Code).

0
ceeit