Dispositivos serie y Arduino
Las funciones integradas Serial* se comunican con cualquier cosa que aparezca como puerto COM: un
Arduino, un ESP32 o una Raspberry Pi Pico por USB, un adaptador USB a serie, un receptor GPS, un
lector de códigos de barras en modo serie, una impresora de tickets o de etiquetas, una impresora 3D
o un controlador CNC que acepta G-code, un instrumento de laboratorio, o una caja de botones, un
teclado de macros, una perilla giratoria o un controlador de LED hechos en casa. El dispositivo envía
y recibe líneas de texto; sus scripts convierten esas líneas en cualquier otra cosa que Input.Observer
pueda hacer.
Algunas ideas:
- Una caja de botones o un teclado de macros. Un Arduino lee sus botones e imprime
B1,B2, ... Un monitor serie convierte cada línea en un método abreviado, una tecla multimedia o un comando de ventana. - Una perilla de volumen o de desplazamiento. Un potenciómetro o un codificador rotatorio imprime su posición; el monitor ajusta el volumen o desplaza el contenido.
- Luces de estado. Un gesto o una tecla de acceso rápido envía
LED 255 0 0a una placa que controla una tira de LED, para que una luz indique que la grabación está activa o que la compilación falló. - Sensores. Un temporizador le pide a una placa una temperatura o un nivel de luz y lo muestra, lo registra en un archivo o atenúa la pantalla.
- Lectores y escáneres. Cada código de barras o etiqueta RFID que envía el lector se convierte en texto escrito, una búsqueda o una consulta en un archivo.
- Máquinas. Envíe líneas de G-code a una impresora o a un plóter, un
SerialWriteTextLinepor comando.
Encontrar el puerto
Windows le da a cada dispositivo un nombre como COM3. El Administrador de dispositivos lo muestra
en Puertos (COM y LPT); el IDE de Arduino lo muestra en su menú de placas. Un script también
puede enumerarlos:
n = SerialEnumeratePorts();
if (n == 0) UtilityPrint("No COM ports. Is the board plugged in?");
for (i = 0; i < n; i = i + 1) {
UtilityPrint(SerialGetEnumeratedPortAt(i));
}
La lista se ordena por número, así que COM3 va antes que COM10. El número puede cambiar cuando el
dispositivo se conecta a otro puerto USB.
Velocidad, formato de trama y finales de línea
- La velocidad (
baudRate) debe coincidir con la del dispositivo: el número deSerial.begin(...)en un sketch de Arduino, normalmente9600o115200. - El formato de trama casi siempre es 8 bits de datos, sin paridad y un bit de parada:
8,SerialParity.None,SerialStopBits.One. Escriba las constantes: el número1solo, como argumento de bits de parada, significa uno y medio bits de parada. - Finales de línea. Una línea recibida termina en el
terminatorque usted indique, que se quita de la línea. Un texto vacío significa CR LF, que es lo que envíaSerial.printlnde Arduino. Para un dispositivo que termina las líneas solo con LF, use"\n"; para solo CR, use"\r".SerialWriteTextLinetermina lo que envía con el mismo terminador, o con CR LF cuando la llamada abre el puerto por sí misma. Con CR LF, un sketch de Arduino que lee conSerial.readStringUntil('\n')recibe la línea con un CR al final, quetrim()quita; con"\n"no hay ningún CR que quitar. - Señales. Abrir un puerto activa sus señales DTR y RTS, como lo hace el IDE de Arduino. Eso reinicia la mayoría de las placas Arduino Uno y Nano, y otras placas con el mismo circuito de reinicio.
Tres formas de comunicarse con un dispositivo
-
Una pregunta, una respuesta.
SerialWriteTextLineySerialGetTextLine, sobre un puerto que no está abierto, lo abren albaudRatede la llamada, 8-N-1, solo para esa llamada. El argumentobaudRatese omite cuando el puerto ya está abierto. Sirve para un dispositivo que no se reinicia cuando se abre su puerto. Consulte Hacer una pregunta a un dispositivo serie. -
Un puerto que se mantiene abierto.
SerialOpenPortabre el puerto con su configuración hastaSerialClosePorty recopila cada línea que envía el dispositivo para queSerialGetTextLinela lea. La mayoría de las placas Arduino Uno y Nano se reinician cada vez que se abre su puerto, así que abra el puerto una sola vez, en el evento global Load, y deje que los gestos y las teclas de acceso rápido escriban en él.SerialOpenPortdevuelvefalsepara un puerto que no existe, está desconectado o está abierto en otro programa; para un puerto que Input.Observer ya tiene abierto, o que tiene un monitor, detiene la acción con un error.// Load global event: open the port once, at the sketch's speed. An Uno or Nano// restarts every time its port opens, so a port opened per command would lose// the command while the board boots.if (!SerialOpenPort("COM4", 115200, SerialParity.None, 8, SerialStopBits.One, "")) {UtilityPrint("COM4 isn't available: unplugged, or open in the Arduino IDE's Serial Monitor?");}// Any gesture or hotkey: send a command line and read the board's reply.// (The sketch reads a line with Serial.readStringUntil('\n') and answers OK.)if (SerialWriteTextLine("COM4", "LED 255 0 0", 115200)) {reply = SerialGetTextLine("COM4", 1, 115200);if (reply != "OK") UtilityPrint(StringFormat("Board said: {0}", reply, ""));} -
Un monitor.
SerialMonitorCreateejecuta un script por cada línea que envía el dispositivo, en segundo plano, hastaSerialMonitorDelete. La línea esContextGetSerialTextLine(). Consulte Asignar los botones de un dispositivo serie a teclas multimedia y:// Arduino side: a potentiometer on A0, one reading per line.// void setup() { Serial.begin(115200); }// void loop() { Serial.println(analogRead(A0)); delay(50); }// Empty text as the terminator means CR LF, which Serial.println sends.SerialMonitorCreate("knob", "COM4", 115200, SerialParity.None, 8, SerialStopBits.One, "","line = ContextGetSerialTextLine(); if (StringIsNumber(line, true)) MultimediaSetVolume(AudioEndpoint.Playback, StringToNumber(line, true) / 1023.0);");
Lo que conviene saber sobre los monitores.
- Las líneas se ejecutan de una en una, en el orden en que llegaron: el script de la siguiente línea empieza cuando terminó el script de la anterior. Hasta 256 líneas esperan; después de eso, se descartan las más antiguas.
- Detener todas las acciones detiene el script que se ejecuta para una línea y descarta las líneas en espera. El monitor en sí sigue en ejecución. La Tecla de acceso rápido para detener todas las acciones va más lejos: elimina todos los monitores y cierra su puerto.
- Cualquier script, incluido el propio script del monitor, puede enviar datos a un puerto monitoreado
con
SerialWriteTextLine, así que un monitor puede responder a su dispositivo.SerialGetTextLineno puede leer un puerto monitoreado: cada línea va al monitor. - Cada nombre de monitor pertenece a un puerto.
SerialMonitorCreatecon el nombre del monitor de este puerto reemplaza ese monitor. Detiene la acción con un error cuando el nombre ya vigila otro puerto, cuando el puerto está abierto conSerialOpenPorto cuando otro monitor tiene el puerto. Un puerto que no existe, está desconectado o está abierto en otro programa dafalse. - Desconectar el dispositivo termina el monitor y escribe una línea en la pestaña Sistema de la
consola. Nada reinicia el monitor cuando el dispositivo vuelve. Ejecute de nuevo
SerialMonitorCreate(desde una tecla de acceso rápido, o desde el evento Load en el siguiente inicio).
Solo un programa puede tener abierto un puerto COM. Mientras el Serial Monitor o el Serial
Plotter del IDE de Arduino estén abiertos, Input.Observer no puede abrir el puerto, y mientras
Input.Observer lo tenga abierto, el IDE no puede cargar un sketch. Cierre el puerto
(SerialClosePort o SerialMonitorDelete) antes de cargar.