Bash, E / S serial y Arduino


Por lo tanto, estoy un poco sobre mi cabeza, y siento que estoy muy cerca de una solución, pero no está funcionando todavía. Esta es mi situación:

Estoy trabajando con un microcontrolador Arduino, y estoy intentando escribir dos scripts Bash (ahora mismo ejecutándose en Mac OS X 10.6) que (a) imprimirán todos los datos en serie que salgan de la unidad Arduino a la salida estándar, y (b) me permitirán enviar datos en serie a la unidad Arduino. Estos scripts se llamarán mediante el proceso NativeProcess de Adobe AIR API para permitir una estrecha integración entre la unidad Arduino y una aplicación Flex Adobe AIR .

Mis dos scripts son muy simples -

Aquí está mi WriteToSerial.sh script:

echo $1 > $2

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

Y aquí está mi ReadSerialOutput.sh script:

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 solo escribo los comandos directamente en la consola Bash), mi computadora simplemente se cuelga - Puedo escribir caracteres, pero nada sucede hasta que Ctrl + C fuera del proceso.

Sin embargo, si abro el IDE Arduino y enciendo el Monitor Serie, entonces tail -f el puerto, cierro el monitor serie y luego echo "test" > puerto serie, todo funciona genial.

Esto me sugiere que abrir el Monitor Serie dentro del IDE de Arduino es de alguna manera inicializar el puerto serie, que a su vez me permite seguirlo sin problema. Esto a su vez me sugiere que simplemente estoy fallando al introducir algún tipo de comando de inicialización. Sin embargo, he estado buscando alto y bajo durante días y parece que no puedo encontrar nada que aborde este problema.

¿Cuál es la solución?

Author: Peter Mortensen, 2010-10-12

10 answers

Intenta usar la herramienta stty :

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

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

 13
Author: J. Polfer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-19 12:56:28

Tengo el mismo problema. Uso Arduino Uno con Ubuntu 12.04. Después de unas horas de búsqueda e intento, descubro que Arduino restablecerá cuando se abra el dispositivo serie por primera vez,pero no se restablecerá cuando se abra de nuevo el dispositivo serie.

Entonces, ejecute el comando - echo "input string" > /dev/ttyXXX en bash restablecerá Arduino y enviará "input string" inmediatamente. Arduino necesita tomar algún tiempo para inicializar, y no es lo suficientemente rápido para recibe esta cadena. cat /dev/ttyXXX también restablecerá Arduino.

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

Aquí está mi solución:

1) abra /dev / ttyXXX redirigiendo /dev / ttyXXX a la descripción del archivo 3

Exec 3/dev / ttyXXX

2) espere la inicialización de Arduino

Sleep 1

3) comunicarse con Arduino

Echo " introduce algo" >&3

Cat

4) close/dev / ttyXXX

Exec 3> & -

 28
Author: Yihui Xiong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-30 06:58:20

También tuve problemas con este problema, probando un sinfín de configuraciones stty y trucos para catear mis archivos a /dev/tty.usbserial-FTF7YNJ5 (en mi caso) mientras está parado en un dedo del pie, etc.

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

Así que simplemente haz: cat super_file.recipiente > /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

 4
Author: chrism,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-24 07:57:07

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

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

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

 2
Author: J. Polfer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:32:45

Tal vez pruebe alguna herramienta de línea de comandos serial similar a serial-1.0.

Ver: Puerto serie loopback/prueba dúplex, en Bash o C? (sustitución de procesos)

 1
Author: dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:16

Intente agregar un ampersand (&) al final de los comandos para poner el proceso en segundo plano. Si la consola está colgando, entonces eso significa que el script o el proceso todavía se está ejecutando en su terminal actual, y no podrá ingresar o hacer clic en nada hasta que el proceso o el script haya terminado.

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

 0
Author: bm7150,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-12 19:22:21
 0
Author: tilo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-13 17:23:50

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

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

Ver: Configurar Xcode para Compilar y Cargar en un Arduino ATmega328 (Duemilanove)

 0
Author: tol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-14 14:57:36

También está 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 más información ver: http://www.arduino.cc/playground/Interfacing/Cocoa

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

 0
Author: ceeit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-15 10:20:12

Un one-liner Algo que funciona muy bien para registro de datos, y actuar sobre los datos:

Resumen
  • monitoreo: la salida arduino puede desencadenar acciones en el equipo
  • registro de datos: guarda simultáneamente esos datos de transmisión en un archivo
  • notchecked? sending-messages: Todavía no he intentado enviar datos al arduino, pero ver el segundo ejemplo, podría ser capaz de enviar un mensaje al puerto serie a través de algún cmdline útil.

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:

introduzca la descripción de la imagen aquí

Este método incluso se puede adaptar 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

 0
Author: gskielian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-19 00:45:56