Czy możesz zapytać o aktualną prędkość portu szeregowego?

9

Czy jest jakiś kod, którego mogę użyć do ustalenia prędkości wybranego portu szeregowego?

Hayden Thring
źródło
1
Może być po prostu łatwiej zdefiniować prędkość w zmiennej :)
Anonimowy pingwin
Czy masz na myśli, że komputer lub inne urządzenie ustawia prędkość szeregową, a Arduino dostosowuje się do siebie?
DaveP

Odpowiedzi:

7

Nie ma najwyższego poziomu, łatwego w użyciu sposób. Przepraszam. Prawdopodobnie łatwiej jest po prostu zapisać wybraną prędkość transmisji w zmiennej podczas konfiguracji portu szeregowego.

W każdym razie, to, co możesz zrobić dla sprzętowych UART-ów opartych na AVR, to cofnięcie czynności Serial.beginustawiania określonej prędkości transmisji, ale jest to trochę uciążliwe. Oto kod do ustawiania prędkości transmisji:

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

Możesz znaleźć wyniki tego, czytając odpowiednie rejestry UCSRA, UBRRH i UBRRL. Na urządzeniu uno są to prawidłowe nazwy rejestrów, na urządzeniu mega: UCSR0A, UBRR0H, UBRR0L dla portu szeregowego, UCRS1A ... dla portu szeregowego itd. Tablice inne niż avr (i Serialna Leonardo) będą zupełnie inne.

Będzie istniał jeden stan dla tych trzech rejestrów na sprzętowym porcie szeregowym AVR dla konkretnej płyty (i częstotliwości tej płyty) przy każdej szybkości transmisji. Możesz spróbować wykonać równanie, aby uzyskać oryginalną szybkość transmisji, ale zalecam po prostu porównanie bezpośrednich wartości z pewnego rodzaju wyszukiwaniem, ponieważ błędy zaokrąglania arytmetycznych liczb całkowitych spowodują, że będzie to wielki bałagan.

Na przykład na moim mega UBBR0H, UBBR0L i UCSR0A są 0, 207, 2 przy 9600 bodów, ale są to 0, 51, 2 przy 38400 bodów i 0, 16, 0 przy 57600 bodów.

BrettAM
źródło
dzięki, tego właśnie szukałem, ale jak powiedziałem, może to być bardziej kłopotliwe niż warte w porównaniu z innymi alternatywami.
Hayden Thring