Gibt es einen Code, mit dem ich herausfinden kann, mit welcher Geschwindigkeit die ausgewählte serielle Schnittstelle läuft?
Gibt es einen Code, mit dem ich herausfinden kann, mit welcher Geschwindigkeit die ausgewählte serielle Schnittstelle läuft?
Antworten:
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.begin
zu 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 Serial
auf 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.