Serial.begin (): ¿Por qué no usar siempre 28800?

En gran parte del código de muestra, la gente agrega la línea Serial.begin(9600) en el bloque de configuración.

Cuando busco lo que Serial.begin() está en la documentación oficial, dice que controla la transferencia de datos bit por segundo.

Entonces, la pregunta obvia es, ¿por qué no utilizar 28800, la tasa de transferencia más alta? ¿Por qué la gente se conforma con 9600? ¿Cuál es la limitación aquí?

Comentarios

  • Para su información, el valor más alto que admite un arduino conectado a USB es en realidad 115200, y 57600 es a menudo el segundo más común baudios que ves.

Responder

¿Por qué la gente ¿establecerse?

La gente se establece porque es más que lo suficientemente rápido. El uso más común es simplemente imprimir algunas cosas en una terminal para depurarlas. 9600 baudios son 960 caracteres por segundo o 12 x 80 líneas de caracteres por segundo. ¿Qué tan rápido puedes leer? 🙂

Si su programa está utilizando el puerto serie para la transferencia de datos en masa, elegiría no conformarse.

¿Qué es la limitación …

Los límites de la serie son altos. Directamente puede usar 115200 baudios en sus programas y simplemente funcionará. El terminal Arduino permitirá un máximo de 115200, pero otros programas como RealTerm le permitirían ejecutar más alto.

La serie de hardware se ejecutará a 1 M baudios. Si lee, verá que las personas han usado hasta 1 M controlando directamente el UART. Puede beneficiarse de altas velocidades en baudios para usos como la transmisión a través de un chip bluetooth. Si está utilizando la interfaz serial de hardware para intercambiar de un chip a otro con una distancia corta, entonces 1 M baudios es completamente factible. Piense en todos los dispositivos SPI e I2C que funcionan bien a una frecuencia de reloj de 1 MHz.

En distancias más grandes, comenzará a tener problemas con el ruido cuando utilice la señalización de nivel lógico (simple 0 a 5 V). Para usar distancias más grandes, agregaría un transceptor para proporcionar una señalización robusta, comúnmente RS-232 y menos comúnmente RS-485. Con RS-232 podría ejecutar un mega bit a distancias de 10 «s de pies.

La velocidad del reloj del microprocesador será el límite real. Con una UART de hardware, el procesador debe cargar un byte a la UART cada 10 bits (para N81). Por lo tanto, cuando llegue a 1 M baudios, será un desafío para el procesador de 16 MHz mantener la UART con datos. Se enviará un nuevo byte cada 160 tics de reloj, que son muy pocas líneas de código. Para una breve ráfaga de datos, puede alcanzar esa velocidad. El mensaje es, el procesador se quedará sin velocidad antes de que el UART sea el límite.

Tenga en cuenta que todo esto se aplica a HardwareSerial , el software de serie es muy diferente.

Comentarios

  • Tenga en cuenta que 2M se puede archivar con hw serial, pero la implementación de arduino ‘ parece demasiado lenta y envía mucha basura. Consulte atmega328p ds para encontrar el bit mágico para duplicar su velocidad. También agregue que 9800 baudios es un estándar muy antiguo, y mucho de los sensores usan ese valor como estándar, incluso si se pueden configurar para más, como xbee, gps y más. También serial sobre usb usa la negociación de auto-baudrate que puede anular el baudate seleccionado, pero creo que arduino no lo usa (pero puede ser en leonardo)
  • 9600 8N1 también es una configuración predeterminada de facto. Muchos dispositivos con una interfaz en serie se entregan con esta configuración y deben configurarse si se requiere otra velocidad (o bits de datos, bit de paridad, bit de parada).
  • » es lo suficientemente rápido » – Buena respuesta, pero no estoy de acuerdo con este punto. La mayoría de las implementaciones de salida de depuración están bloqueando, por lo que es muy deseable hacer la salida de depuración lo más rápido posible para evitar cambios excesivos en el tiempo de ejecución del código.
  • Si ‘ si está realizando una transferencia de datos masiva, idealmente ‘ estaría usando SPI, ¿verdad?

Respuesta

Además de todas las respuestas interesantes, vale la pena mencionar que establecer la velocidad serial en XXX bits / s no implica necesariamente XXX bits / s en el hardware.

Los relojes, incluso los de cuarzo, son imperfectos y están sujetos a variaciones. Además, como el reloj en serie generalmente se genera a través de un divisor previo de potencia de dos y un contador (de números enteros), no se pueden obtener todos los valores con precisión dada una frecuencia de reloj base. Con la ayuda de los bits de inicio / parada, la comunicación en serie asíncrona puede ser tolerante a alguna desviación del reloj. Pero esto tiene límites.

Por ejemplo, si su ATmega328PA se ejecuta a 1MHz, puede alcanzar 9600b / s al 0.2% de error. Pero a 14400b / s el error es -3.5% (en realidad se comunica a 13900b / s). Y a 28800b / s, el error es de + 8.5% (en realidad se comunica a 31200b / s).Todas esas cifras son de la hoja de datos ATmega48PA-88PA-168PA-328PA, p200 .

Esto no es un problema cuando dos dispositivos idénticos se comunican juntos (ya que de hecho se comunican a la misma velocidad). Podría ser un problema al comunicarse entre diferentes dispositivos.

Aumentar la frecuencia base no necesariamente mejora significativamente la precisión. Por ejemplo, ejecutar el mismo ATmega328PA que el anterior a 2MHz no da mejores resultados, ya que se deben principalmente a errores de redondeo. Pero ejecutarlo a 1.8432MHz da bps muy precisos desde 2400b / s hasta 57.6kHz.

Respuesta

Creo que es un Es una especie de tradición utilizar una tasa de transferencia que no sea la más lenta (300), pero tampoco una que eventualmente pueda causar problemas en algunas configuraciones (28800 o incluso 115200). El puerto serie de la PC (generalmente un adaptador USB FTDI232) puede soportar velocidades más altas, pero es posible que su hardware de bricolaje no. Así que 9600 bps se ha establecido como una especie de tasa de transferencia estándar para ejemplos de código.

Respuesta

De vuelta en la bruma del tiempo , el «estándar de oro» para los teclados remotos (usando un módem telefónico y teletipos, si recuerda esos) era 9600 baudios, inicialmente alcanzable solo a través de una línea telefónica dedicada. El tiempo avanza, lentamente; la tecnología avanza rápidamente; y la memoria se mueve aún más lentamente que el tiempo (parece). Podemos comunicarnos de forma rutinaria, al menos a varios metros, en un par de órdenes de magnitud más rápido que 9600 baudios. Lo que alguna vez se consideró un estándar de oro ya no es oro, pero todavía se considera un estándar.

tl; dr: Es historia, no tecnología.

Respuesta

Creo que la razón principal por la que la gente usa 9600 la mayor parte del tiempo es que es la velocidad en baudios predeterminada en el IDE de Arduino. Además, las velocidades de datos más rápidas también podrían no ser confiables si la señal en serie tiene que viajar un largo camino, aunque no tengo idea de por qué se seleccionó como velocidad óptima.

Respuesta

Tiempo de reacción humano

Porque poder detener el monitor en serie cuando tu Arduino está golpeando el puerto es requerido por los usuarios el 100% del tiempo, y se requiere tener la velocidad máxima de transferencia menor que 100% de las veces.

9600 baudios es un compromiso entre «fácil de matar un proceso fuera de control» y «molestamente lento».

Comentarios

  • 100% hey … interesante;)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *