現在のシリアルポートの速度を照会できますか?


9

選択したシリアルポートの速度を確認するために使用できるコードはありますか?


1
変数で速度を定義する方が簡単かもしれません:)
匿名のペンギン

PCまたは他のデバイスがシリアル速度を設定し、Arduinoがそれに合わせて調整することを意味しますか?
DaveP 2015年

回答:


7

トップレベルではない、使いやすい方法。ごめんなさい。おそらく、シリアルポートを設定するときに、選択したボーレートを変数に格納する方が簡単です。

とにかく、AVRベースのハードウェアUARTに対して実行できることSerial.beginは、特定のボーレートを設定するために何を行うかを取り消すことですが、少し面倒です。これはボーレートを設定するためのコードです:

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

この結果は、正しいUCSRA、UBRRH、UBRRLレジスタを読み取ることで確認できます。unoでは、これらは正しいレジスタ名です。megaでは、UCSR0A、UBRR0H、UBRR0L、Serial1、UCRS1A ...、serial1などです。AVR以外のボード(およびレオナルド上Serial)はまったく異なります。

各ボーレートで特定のボード(およびそのボードの周波数)のAVRハードウェアシリアルポート上のこれらの3つのレジスタの単一の状態になります。元のボーレートを取得するための計算式を試してみることもできますが、整数演算の丸め誤差によって非常に混乱するため、直接の値を何らかのルックアップと比較することをお勧めします。

たとえば、私のメガUBBR0H、UBBR0L、およびUCSR0Aでは、9600ボーで0、207、2ですが、38400ボーで0、51、2、57600ボーで0、16、0です。


おかげで、これは私が探していたものですが、他の選択肢と比較して、それは価値があるよりももっと難しいかもしれません。
Hayden Thring 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.