Seçilen bir seri bağlantı noktasının hızının ne olduğunu öğrenmek için kullanabileceğim bazı kodlar var mı?
Seçilen bir seri bağlantı noktasının hızının ne olduğunu öğrenmek için kullanabileceğim bazı kodlar var mı?
Yanıtlar:
Üst düzey, kullanımı kolay bir yol yoktur. Afedersiniz. Seri bağlantı noktasını ayarlarken seçtiğiniz baud hızını bir değişkende saklamak muhtemelen daha kolaydır.
Her neyse, AVR tabanlı, donanım UART'ları için yapmayı deneyebileceğiniz şey Serial.begin
, belirli bir baud hızı ayarlamak için ne yaptığını geri almaktır , ancak biraz acıdır. Baud hızını ayarlamak için kod:
// 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;
Bunun sonuçlarını doğru UCSRA, UBRRH ve UBRRL kayıtlarını okuyarak bulabilirsiniz. Bir uno üzerinde doğru kayıt isimleri, bir mega üzerinde UCSR0A, UBRR0H, Seri için UBRR0L, seri1 için UCRS1A ... vardır. Avr dışı tahtalar (ve Serial
bir leonardo üzerinde) tamamen farklı olacaktır.
Her baud hızında belirli bir kart (ve o kartın frekansı) için bir AVR donanım seri portunda bu üç kayıt için tek bir durum olacaktır. Orijinal baud hızını elde etmek için bir denklem deneyebilirsiniz, ancak doğrudan değerleri bir tür arama ile karşılaştırmanızı öneririz çünkü tamsayı aritmetik yuvarlama hataları onu büyük bir karışıklık haline getirecektir.
Örneğin, mega UBBR0H, UBBR0L ve UCSR0A'm 9600 baud'da 0, 207, 2, ancak 38400 baud'da 0, 51, 2 ve 57600 baud'da 0, 16, 0.