¿Hay algún código que pueda usar para averiguar a qué velocidad de un puerto serie elegido se está ejecutando?
¿Hay algún código que pueda usar para averiguar a qué velocidad de un puerto serie elegido se está ejecutando?
Respuestas:
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.begin
hace 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 Serial
en 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.