Pouvez-vous interroger la vitesse du port série actuel?

9

Existe-t-il un code que je peux utiliser pour savoir à quelle vitesse le port série choisi s'exécute?

Hayden Thring
la source
1
Pourrait être plus facile de définir la vitesse dans une variable :)
Anonymous Penguin
Voulez-vous dire que le PC ou un autre appareil définit la vitesse série et l'Arduino pour s'ajuster en fonction?
DaveP

Réponses:

7

Il n'y a pas de moyen de haut niveau facile à utiliser. Désolé. Il est probablement plus facile de simplement stocker le débit en bauds choisi dans une variable lorsque vous configurez le port série.

Quoi qu'il en soit, ce que vous pouvez essayer de faire pour les UART matériels basés sur AVR est de défaire ce qui Serial.beginpermet de configurer un débit en bauds particulier, mais c'est un peu pénible. Voici le code pour régler le débit en bauds:

  // 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;

Vous pouvez trouver les résultats de cela en lisant les registres UCSRA, UBRRH et UBRRL appropriés. Sur un un, ce sont les noms de registre corrects, sur un méga son UCSR0A, UBRR0H, UBRR0L pour Serial, UCRS1A ... pour serial1 et ainsi de suite. Les planches non-avr (et Serialsur un leonardo) seront totalement différentes.

Il y aura un seul état pour ces trois registres sur un port série matériel AVR pour une carte particulière (et la fréquence de cette carte) à chaque débit en bauds. Vous pouvez essayer de faire une équation pour obtenir le débit en bauds d'origine, mais je recommande simplement de comparer les valeurs directes avec une recherche quelconque, car les erreurs d'arrondi arithmétiques entières en feront un énorme gâchis.

Par exemple, sur mes méga UBBR0H, UBBR0L et UCSR0A, il y a 0, 207, 2 à 9600 bauds, mais ils sont 0, 51, 2 à 38400 bauds et 0, 16, 0 à 57600 bauds.

BrettAM
la source
merci, c'est le genre de chose que je cherchais, mais comme dit, cela peut être plus difficile que la valeur par rapport à d'autres alternatives.
Hayden Thring