bash command-line serial-port arduino

Bash, serial I/O y Arduino



command-line serial-port (10)

Algo de una sola línea que funciona realmente bien para el registro de datos y actuar sobre los datos:

Resumen
  • Monitorización: la salida de arduino puede desencadenar acciones en el ordenador.
  • registro de datos: guarda simultáneamente esa transmisión de datos en un archivo
  • ¿Sin revisar? envío de mensajes: no he intentado enviar datos a arduino todavía, pero vea el segundo ejemplo, podría enviar un mensaje al puerto serie a través de alguna utilidad de cmdline.

las siguientes marcas de tiempo y envía a stdout

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

Salida de muestra:

Este método puede incluso adaptarse para monitorear y actuar sobre los datos en tiempo real:

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

Más ejemplos aquí: https://github.com/gskielian/Arduino-DataLogging/tree/master/Bash-One-Liner

Por lo tanto, estoy un poco desconcertado y siento que estoy muy cerca de una solución, pero aún no está funcionando del todo. Aquí está mi situación:

Estoy trabajando con un microcontrolador Arduino, y estoy intentando escribir dos scripts Bash (ahora en ejecución en Mac OS X 10.6) que (a) imprimirán todos los datos en serie que salen de la unidad Arduino en la salida estándar, y (b) Permítame enviar datos en serie a la unidad Arduino. Luego se llamará a estos scripts utilizando la API NativeProcess de Adobe AIR para permitir una integración estrecha entre la unidad Arduino y la aplicación Flex AIR AIR .

Mis dos guiones son muy simples.

Aquí está mi script WriteToSerial.sh:

echo $1 > $2

($ 1 es obviamente mi cadena, $ 2 es la ubicación del puerto serie - actualmente /dev/tty.usbserial-A800eIUj)

Y aquí está mi script ReadSerialOutput.sh:

tail -f $1

($ 1 es la ubicación de mi puerto serie, actualmente /dev/tty.usbserial-A800eIUj)

Cuando llamo a cualquiera de estos scripts (o incluso si escribo los comandos directamente en la consola Bash), mi computadora simplemente se cuelga: puedo escribir caracteres, pero no sucede nada hasta que Ctrl + C sale del proceso.

Sin embargo, si abro el IDE de Arduino y enciendo el Monitor de serie, a continuación, cierro el puerto, cierro el monitor de serie y luego hago eco en el puerto de "prueba">, todo funciona de maravilla.

Esto me sugiere que abrir el Monitor Serial dentro del IDE de Arduino de alguna manera está inicializando el puerto serie, lo que a su vez me permite seguirlo sin problemas. Esto a su vez me sugiere que simplemente no estoy ingresando algún tipo de comando de inicialización. Sin embargo, he estado buscando días altos y bajos y parece que no puedo encontrar nada que aborde este problema.

¿Cuál es la solución?


Compruebe si el envío de datos a / la recepción de datos desde la unidad Arduino funciona mediante una aplicación diferente, como Cornflake (terminal en serie para Mac OS X), en lugar de usar el IDE de Arduino y el Monitor en serie.

Además, es posible que desee comprobar si podría beneficiarse de cambiar a Xcode (en términos de características de depuración, etc.).

Consulte: Configuración de Xcode para compilar y cargar en un Arduino ATMega328 (Duemilanove)


En Linux, debe llamar a setserial para configurar las opciones de puerto serie (velocidad en baudios, paridad, control de flujo, etc.) antes de poder leer / escribir el puerto correctamente.

Debe encontrar una manera de hacer esto con su sistema Mac OS X Bash.

O podrías escribir un script en Python para hacer esto.


Intente agregar un ampersand (&) al final de los comandos para poner el proceso en segundo plano. Si la consola cuelga, significa que el script o el proceso aún se está ejecutando en su terminal actual, y no podrá ingresar ni hacer clic en nada hasta que el proceso o el script finalicen.

También puede intentar ejecutar el comando en 1 ventana de terminal, abrir una nueva ventana / pestaña de terminal e intentar seguir desde allí.




También existe la herramienta de línea de comandos SerialPortSample de Apple que le permite establecer velocidades de transmisión arbitrarias:

// 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. // ...

Para obtener más información, consulte: http://www.arduino.cc/playground/Interfacing/Cocoa

Otra pieza del código de ejemplo Cocoa que muestra cómo hablar con el microcontrolador Arduino a través de una conexión en serie es el objetivo-candarduino (alojado en el código de Google).


También tuve problemas con este problema, probando una gran cantidad de configuraciones y trucos para cargar mis archivos a /dev/tty.usbserial-FTF7YNJ5 (en mi caso) mientras estaba parado en un dedo del pie, etc.

Luego hice un ls / dev y noté /dev/cu.usbserial-FTF7YNJ5 - oh, ¿qué es esto? Aparentemente, una versión de ''unidad de llamada'' del dispositivo que no espera ni proporciona ningún control de flujo. Vuelca los bytes al puerto. Exactamente lo que necesitaba.

Así que hazlo: cat super_file.bin> /dev/cu.usbserial-XXXXX

Espero que esto ayude. Y solo ahora que sé la respuesta, encontré esto: http://stuffthingsandjunk.blogspot.com/2009/03/devcu-vs-devtty-osx-serial-ports.html


Trate de usar la herramienta stty :

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

Como siempre, lea la página del manual antes de aplicar lo anterior. cread te permite recibir datos. Es posible que desee omitir clocal si está utilizando el control de flujo. Si no está seguro de cuáles son las configuraciones anteriores, pregunte, y puedo escribir una respuesta más completa.


Yo también tengo el mismo problema. Yo uso Arduino Uno con Ubuntu 12.04. Después de algunas horas de búsqueda e intento, descubro que Arduino se reiniciará cuando se abra el dispositivo serie por primera vez , pero no se reiniciará cuando se vuelva a abrir.

Por lo tanto, ejecute el comando: echo "input string"> / dev / ttyXXX en bash reiniciará Arduino y enviará "input string" inmediatamente. Arduino necesita algo de tiempo para inicializarse, y no es lo suficientemente rápido para recibir esta cadena. cat / dev / ttyXXX reiniciará Arduino también.

Cuando / dev / ttyXXX se abre en algún lugar en primer lugar, estos comandos funcionarán.

Aquí está mi solución:

1) abra / dev / ttyXXX redireccionando / dev / ttyXXX al archivo descripción 3

exec 3 <> / dev / ttyXXX

2) esperar la inicialización de Arduino

dormir 1

3) comunicarse con arduino

echo "ingresar algo"> & 3

gato <& 3

4) cerrar / dev / ttyXXX

exec 3> & -