¿Se puede consultar la velocidad del puerto serie actual?

9

¿Hay algún código que pueda usar para averiguar a qué velocidad de un puerto serie elegido se está ejecutando?

Hayden Thring
fuente
1
Podría ser más fácil definir la velocidad en una variable :)
Anonymous Penguin
¿Quiere decir que la PC o algún otro dispositivo establece la velocidad de serie y el Arduino se ajusta para que coincida?
DaveP

Respuestas:

7

No hay un nivel superior, una forma fácil de usar. Lo siento. Probablemente sea más fácil almacenar la velocidad de transmisión elegida en una variable cuando configura el puerto serie.

De todos modos, lo que puede intentar hacer para los UART de hardware basados ​​en AVR es deshacer lo que Serial.beginhace para configurar una velocidad de transmisión en particular, pero es un poco molesto. Este es el código para configurar la velocidad en baudios:

  // Try u2x mode first
  uint16_t baud_setting = (F_CPU / 4 / baud - 1) / 2;
  *_ucsra = 1 << U2X0;

  // hardcoded exception for 57600 for compatibility with the bootloader
  // shipped with the Duemilanove and previous boards and the firmware
  // on the 8U2 on the Uno and Mega 2560. Also, The baud_setting cannot
  // be > 4095, so switch back to non-u2x mode if the baud rate is too
  // low.
  if (((F_CPU == 16000000UL) && (baud == 57600)) || (baud_setting >4095))
  {
    *_ucsra = 0;
    baud_setting = (F_CPU / 8 / baud - 1) / 2;
  }

  // assign the baud_setting, a.k.a. ubrr (USART Baud Rate Register)
  *_ubrrh = baud_setting >> 8;
  *_ubrrl = baud_setting;

Puede encontrar los resultados de esto leyendo los registros correctos UCSRA, UBRRH y UBRRL. En uno, esos son los nombres de registro correctos, en un mega sus UCSR0A, UBRR0H, UBRR0L para Serial, UCRS1A ... para serial1 y así sucesivamente. Los tableros no avr (y Serialen un leonardo) serán totalmente diferentes.

Habrá un solo estado para esos tres registros en un puerto serie de hardware AVR para una placa en particular (y la frecuencia de esa placa) a cada velocidad de transmisión. Puede intentar hacer una ecuación para obtener la velocidad de transmisión original, pero le recomiendo comparar los valores directos con una búsqueda de algún tipo porque los errores de redondeo aritmético de enteros lo harán un gran desastre.

Por ejemplo, en mi mega UBBR0H, UBBR0L y UCSR0A son 0, 207, 2 a 9600 baudios, pero son 0, 51, 2 a 38400 baudios y 0, 16, 0 a 57600 baudios.

BrettAM
fuente
gracias, este es el tipo de cosas que estaba buscando, pero como dije puede ser más problemático que valioso en comparación con otras alternativas.
Hayden Thring