Können Sie die Geschwindigkeit der aktuellen seriellen Schnittstelle abfragen?

9

Gibt es einen Code, mit dem ich herausfinden kann, mit welcher Geschwindigkeit die ausgewählte serielle Schnittstelle läuft?

Hayden Thring
quelle
1
Könnte einfach einfacher sein, die Geschwindigkeit in einer Variablen zu definieren :)
Anonymer Pinguin
Meinen Sie damit, dass der PC oder ein anderes Gerät die serielle Geschwindigkeit einstellt und der Arduino sich anpasst?
DaveP

Antworten:

7

Es gibt keinen einfach zu bedienenden Top-Level-Weg. Es tut uns leid. Es ist wahrscheinlich einfacher, die von Ihnen gewählte Baudrate in einer Variablen zu speichern, wenn Sie die serielle Schnittstelle einrichten.

Wie auch immer, was Sie versuchen können, für die AVR-basierten Hardware-UARTs zu tun, ist rückgängig Serial.beginzu machen, was zum Einrichten einer bestimmten Baudrate getan wird, aber es ist ein bisschen schmerzhaft. Dies ist der Code zum Einstellen der Baudrate:

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

Sie können die Ergebnisse finden, indem Sie die richtigen UCSRA-, UBRRH- und UBRRL-Register lesen. Auf einem Uno sind dies die richtigen Registernamen, auf einem Mega seine UCSR0A, UBRR0H, UBRR0L für Serial, UCRS1A ... für Serial1 und so weiter. Nicht-AVR-Boards (und Serialauf einem Leonardo) werden völlig anders sein.

Für diese drei Register an einer seriellen AVR-Hardware-Schnittstelle gibt es für jede bestimmte Karte (und Frequenz dieser Karte) bei jeder Baudrate einen einzigen Status. Sie können versuchen, eine Gleichung zu erstellen, um die ursprüngliche Baudrate zu ermitteln. Ich empfehle jedoch, nur die direkten Werte mit einer Suche zu vergleichen, da die ganzzahligen arithmetischen Rundungsfehler zu einem großen Durcheinander führen.

Bei meinem Mega-UBBR0H sind UBBR0L und UCSR0A beispielsweise 0, 207, 2 bei 9600 Baud, aber 0, 51, 2 bei 38400 Baud und 0, 16, 0 bei 57600 Baud.

BrettAM
quelle
danke, das ist die Art von Dingen, nach denen ich gesucht habe, aber wie gesagt, es kann mehr Ärger als Wert sein, verglichen mit anderen Alternativen.
Hayden Thring