Arduino - 如何将 uint16_t 转换为十六进制

Arduino - How to convert uint16_t to Hex

我目前正在研究将数据发送到 3 个 TLC5971 LED 驱动器的草图。我需要接受 uint16_t 形式的亮度级别,然后将该值转换为两个 8 位十六进制数以传递给 LED 驱动器。

示例 65535 --> 0xFF0xFF

有什么比较简单的方法吗?我发现了几种 return 字符数组和诸如此类的方法,但它们似乎不容易实现。

有没有人有做类似事情的经验?

试试这个:

uint16_t value;
uint8_t msb = (value & 0xFF00U) >> 8U;
uint8_t lsb = (value & 0x00FFU);

编辑 1:
您可以使事情复杂化并使用结构:

struct MSB_LSB
{
  unsigned int MSB : 8;
  unsigned int LSB : 8;
};
uint16_t value = 0x55aa;
uint8_t msb = ((MSB_LSB)(value)).MSB;
uint8_t lsb = ((MSB_LSB)(value)).LSB;

顺便说一句,十进制、十六进制和八进制是 表示法 的示例。这些表示供人类理解。计算机以便于处理器处理的表示形式在内部存储数字。因此,当您指定十进制数时,编译器会将十进制数转换为更适合处理器的值。我们人类,可以用我们最容易理解的方式来表示数字。

uint16_t value = 0x1234;    // Use example with different high/low byte values
unsigned char high_byte = value >> 8;   // = 0x12
unsigned char low_byte = value & 0xFF;  // = 0x34

使用联合:

typedef union
{
 unsigned short s;
 unsigned char b[2];
} short2bytes_t;

unsigned short value=65535;
unsigned char  MSB, LSB;

short2bytes_t s2b;
s2b.s = value;
MSB=s2b.b[1];
LSB=s2b.b[0];

printf("%d -> 0x%02X 0x%02X\n", value, MSB, LSB);