Mevcut seri bağlantı noktasının hızını sorgulayabilir misiniz?


9

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ı?


1
Bir değişkenin hızını tanımlamak daha kolay olabilir :)
Anonim Penguen

PC veya başka bir cihazın seri hızını ayarladığını ve Arduino'nun kendisini eşleşecek şekilde ayarlamasını mı kastediyorsunuz?
DaveP

Yanıtlar:


7

Ü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 Serialbir 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.


teşekkürler bu aradığım şey, ama dediğim gibi diğer alternatifleri ile karşılaştırıldığında değer daha fazla sorun olabilir.
Hayden Thring
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.