Você pode consultar a velocidade da porta serial atual?

9

Existe algum código que eu possa usar para descobrir em que velocidade a porta serial escolhida está sendo executada?

Hayden Thring
fonte
11
Só poderia ser mais fácil definir a velocidade em uma variável :)
Pinguim Anonymous
Você quer dizer que o PC ou algum outro dispositivo define a velocidade serial e o Arduino para ajustar-se para corresponder?
DaveP

Respostas:

7

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.beginfaz 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 Serialem 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.

BrettAM
fonte
obrigado, esse é o tipo de coisa que eu estava procurando, mas, como disse, pode ser mais difícil do que valer a pena em comparação com outras alternativas.
Hayden Thring 03/03