Existe algum código que eu possa usar para descobrir em que velocidade a porta serial escolhida está sendo executada?
Existe algum código que eu possa usar para descobrir em que velocidade a porta serial escolhida está sendo executada?
Respostas:
Não existe um nível superior, fácil de usar. Desculpa. Provavelmente, é mais fácil armazenar a taxa de transmissão escolhida em uma variável quando você configura a porta serial.
De qualquer forma, o que você pode tentar fazer pelos UARTs de hardware baseados em AVR é desfazer o que Serial.begin
faz para configurar uma taxa de transmissão específica, mas é um pouco trabalhoso. Este é o código para definir a taxa de transmissão:
// 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;
Você pode encontrar os resultados disso lendo os registros UCSRA, UBRRH e UBRRL corretos. Em um uno esses são os nomes de registro corretos, em um mega seu UCSR0A, UBRR0H, UBRR0L para Serial, UCRS1A ... para serial1 e assim por diante. Placas não-avr (e Serial
em um leonardo) serão totalmente diferentes.
Haverá um estado único para esses três registros em uma porta serial de hardware AVR para uma placa específica (e a frequência dessa placa) a cada taxa de transmissão. Você pode tentar fazer uma equação para obter a taxa de transmissão original, mas eu recomendo apenas comparar os valores diretos com uma pesquisa de algum tipo, porque os erros de arredondamento aritmético inteiro tornarão uma grande bagunça.
Por exemplo, no meu mega UBBR0H, UBBR0L e UCSR0A são 0, 207, 2 a 9600 baud, mas são 0, 51, 2 a 38400 baud e 0, 16, 0 a 57600 baud.