有人知道如何在我的STM32F091的C程序中从uint16到uint8进行正确的转换吗?
我认为是这样的:
uint16_t Test = 0x565;
uint8_t Test2 = (uint8_t)Test;
但这并不是很有效,所以有人有建议吗?
[从comment更新:]
我使用的电位计最小值为0x0,最大值为0xFFF。测试必须具有ADC1-> DR的值(这是STM32F0中ADC的值)
答案 0 :(得分:3)
修改强>
在这种情况下,如果没有信息丢失,则无法压缩数据。由于ADC的数据范围是0x000到0xFFF - 如果没有信息/精度丢失,uint8字节的范围仅为0x00到0xFF,则无法完美地表示数据
但您仍然可以将数据映射到精度丢失。例如:
uint8_t Test2 = (unsigned)(Test >> 4);
将使您将每16个范围映射到单个值:
0-15 -> 0
16-31 -> 1
32-47 -> 2
//and so on
由于您无论如何只有8个LED,您可以使用uint8字节来控制LED - 虽然您将失去实际值的精度,但您仍然能够表示值的范围(每单位16个)< em>正确与您的8个LED(因为您仅有8个LED)
<强>原始强>
当您将较大尺寸的uint16数据类型转换为较小尺寸的uint8时,很可能是溢出导致的情况:
uint16_t Test = 0x565;
uint8_t Test2 = (uint8_t)Test; //Test2 value is only 0x65, 0x500 is missing
转换会导致最重要的字节值(0x500)被截断。