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