Czy jest jakiś kod, którego mogę użyć do ustalenia prędkości wybranego portu szeregowego?
Czy jest jakiś kod, którego mogę użyć do ustalenia prędkości wybranego portu szeregowego?
Odpowiedzi:
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.begin
ustawiania 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 Serial
na 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.