Pregunta:
¿Está bien imprimir Serial.print (mensaje) cuando el cable USB no está conectado a una PC host?
David Cary
2016-02-21 02:09:09 UTC
view on stackexchange narkive permalink

A menudo pongo un montón de Serial.print (F ("mensajes de depuración")) en mi boceto de Arduino.

Normalmente, esos mensajes van desde un cable USB a un host PC para que esos mensajes se puedan ver en el monitor serial.

Quiero instalar este Arduino como parte de un sistema independiente lejos de cualquier PC y conectar el extremo "host" del cable USB en un cargador USB de pared.

Sin nada para aceptar esos mensajes, el búfer del Arduino eventualmente se llena, ¿verdad? ¿Tengo que hacer algo para evitar que el Arduino se desborde y se bloquee cuando no está conectado? a una PC host?

¿Hay alguna diferencia si estoy usando un (1) "single-chip" compatible con Arduino donde el procesador incluye USB en chip, frente a (2) un Arduino -compatible con "chip de interfaz USB" y "chip de procesador" separados? (Por "compatible con Arduino de un solo chip", me refiero a cosas como Arduino Leonardo, Arduino Yún, LilyPad Arduino USB, Arduino Micro, Teensy-LC, etc. .)

One responder:
BrettAM
2016-02-21 02:41:43 UTC
view on stackexchange narkive permalink

Está bien escribir datos en serie sin nada conectado.

En el caso (2) "Arduino + chip de interfaz USB", el arduino no tiene idea si hay algo conectado o escuchando el puerto serie . El código transmitirá los bytes y actuará exactamente igual, ya sea que esté conectado a algo o no.

En el caso (1) "arduino con USB integrado" tiene una idea, pero solo descarta los bytes que van para ser transmitido cuando el puerto USB no está conectado.

El hardware serial (caso 2) tiene un búfer de salida, pero eso solo hace que el programa sea un poco más rápido. Cuando el búfer está vacío, una llamada a serial. {Print, write} colocará bytes en el búfer y continuará. Cuando esté lleno, Serial. {Print, write} esperará hasta que haya suficiente espacio para poner el resto del mensaje en el búfer y continuar. El hardware UART y las interrupciones que genera seguirán sacando bytes del búfer y transmitiéndolos a una velocidad constante, ya sea que algo esté conectado o no. En cualquier caso, el búfer es de un tamaño fijo y nunca se desbordará.

Hasta donde puedo decir, USB-Serial (caso 1) solo almacena los datos entrantes. Dado que las llamadas a Serial. {Print, write} no hacen nada cuando no están conectadas, es posible que tomen menos tiempo que de otra manera. Si su código es realmente inseguro sobre la sincronización, eso podría causar un problema, pero dudo que lo haga.

Muchos ejemplos que vienen con el IDE de Arduino tienen el siguiente código que pausa los USB nativos compatibles con Arduino hasta que se inicializa la conexión USB:

  while (! Serial) {; // espera a que se conecte el puerto serie. Necesario solo para el puerto USB nativo}  

Este código evita que Arduino haga algo hasta que el cable USB esté conectado. Comente o elimine esas 3 líneas si desea que Arduino se ejecute "stand- solo "sin una conexión de cable USB ( Arduino Cookbook p. 117) - después de borrar esas líneas, si luego conecta un cable USB, el USB se inicializará correctamente y luego verá en su monitor serial todo lo impreso por cualquier posterior serial .print () comandos que se ejecutan. (Probado en un Teensy LC).

`Cuando esté lleno, Serial. {Print, write} esperará` - para aclarar, se llena debido a la velocidad (es decir, está imprimiendo demasiado rápido) no porque no haya nada conectado.
En el caso (1), cuando dice "elimina bytes que se van a transmitir cuando el puerto USB no está conectado", ¿quiere decir que los transmite (tal vez a la nada) a través de hardware TX?
Lo siento, @NickGammon,, pero me parece que, al menos en una placa basada en Leonardo (con soporte USB en la CPU), si subo un boceto bastante complejo con un montón de Serial.print (probado en 9600 y 115200), ver que: 1) si enciendo la placa, con un USB externo conectado a una PC; todo funciona perfectamente. Y aún funciona si "desconecto" el cable; 2) Si enciendo la placa _SIN_ ningún cable conectado, ¡la placa nunca entra ni siquiera en el bucle principal ()! - Me parece que cuando el búfer "se llena", todo se cuelga. ¿Es este un comportamiento esperado (... que debería eludir a nivel de aplicación)?
Los bocetos con chips de estilo Leonardo con USB integrado a menudo tienen un bucle en la configuración: `while (! Serial.available ()) {}` que se repite indefinidamente hasta que se establece la conexión en serie a través del USB. Será este bucle el que hará que parezca que se cuelga. En los otros tableros, esa llamada regresa inmediatamente y cualquier dato enviado simplemente desaparece "por el extremo del cable" si no hay nada conectado. Siempre puede hacer que ese bucle salga después de (digamos) 10,000 iteraciones, o después de que hayan transcurrido un par de segundos. .


Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...