这行简单的 C 代码如何工作?

How does this simple line of C code work?

我需要 Arduino Uno 上的 9 位 UART 数据,所以我必须对 Arduino UART 进行一些手动设置。 基本上,我不理解这行示例代码(来自数据表),它是为了在 Arduino 上启用 UART Tx 和 Rx 引脚,这是用简单易懂的机器语言完成的,只是意味着加载一个即时值到UCSR0B(USART 控制和状态寄存器 B)RXE(接收启用)位和 TXE(传输启用)位均为高电平。换句话说,将 00011000 加载到 USCR0B.

这是数据表中的示例 C 代码:

USCR0B = (1 << RXE) | (1 << TXE);

RXETXE 是位 索引 ,所以 (1<<RXE) | (1<<TXE) 是一个 掩码 ,其中 TXERXE 位都等于 1(所有其他位都为 0)。

例如我不知道 RXETXE 的实际值,但假设 TXE 是位 3,RXE 是位 4,那么相关的头文件定义可能看起来像这样:

#define TXE 3  // TX Enable = bit 3
#define RXE 4  // RX Enable = bit 4

掩码计算将像这样工作:

            1<<TXE  = 00001000 = 0x08
            1<<RXE  = 00010000 = 0x10
(1<<RXE) | (1<<TXE) = 00011000 - 0x18