如何将 uint32_t 转换为 double 或 float 并打印?
How to convert uint32_t to double or float and print?
我正在使用模数转换器读取从 0 到 3.3V 的电压值。 ADC 给出从 0x00
到 0x0FFF
(0 到 4095)的输出。我想打印带两位小数的电压读数。我已经阅读了很多答案,但我尝试过的都没有奏效。这是我的代码:
uint32_t pui32ADC0Value[1]; // ADC0 data value
double D0v; // Decimal value
// Read value from ADC
ADCSequenceDataGet(ADC0_BASE, 3, pui32ADC0Value);
// Convert to decimal
D0v = (double)pui32ADC0Value[0] / 4095 * 3.3;
// Print to console
UART0printf("\n\r> D0 = %.2d V", D0v);
我得到的输出是:D0 = ERROR2d V
pui32ADC0Value
打印没有任何问题并给出预期值,所以我知道它正在工作。
这个错误是什么意思?
注意:UART0printf
是我使用的 TIVA TM4C 微控制器上的预定义 UART 函数。
更新: 我错误地认为 UART0printf
与 printf
相同,因为我之前在 %u
、[=21] 中使用过它=],以及 %x
。但是,对于数字,它仅支持 %c
、%i
和 %u
。我正在重新编写我的代码,如果我没有任何进展,我会更新。
更新 2:
我可以做这样的事情吗?我知道它会错误地四舍五入...
uint32_t pui32ADC0Value[1]; // ADC0 data value
uint32_t D0v[2]; // Decimal value
// Read value from ADC
ADCSequenceDataGet(ADC0_BASE, 3, pui32ADC0Value);
// Convert to decimal
for ( int i = 0; i <= 2; i++){
D0v[i] = (pui32ADC0Value[0]/10^i) / 4096 * 3.3;
}
// Display the AIN0 (PE0) digital value on the console.
UART0printf("\n\r> D0 = %d.%d%d V", D0v[0],D0v[1],D0v[2]);
如果此功能有效printf
,例如:
UART0printf("\n\r> D0 = %.2f V\n", D0v);
此外,如果您使用以下代码,您的代码可能会运行得更快:
D0v = (double)pui32ADC0Value[0] * (3.3 / 4095);
编译器将预先计算 3.3 / 4095
并将执行单个浮点乘法运算。否则有可能首先完成除法(这通常比乘法需要更多 CPU 周期)然后乘法 * 3.3
将完成。
此外,由于您似乎只需要 2 位精度,因此您可以使用 float
(单精度)代替 double
。它可能执行得更快(但也可能更慢),这取决于平台。
问题中 UPDATE2 的更新:
试试这个:
uint32_t pui32ADC0Value[1]; // ADC0 data value
uint32_t D0v; // Decimal value
// Read value from ADC
ADCSequenceDataGet(ADC0_BASE, 3, pui32ADC0Value);
// Convert to millivolts
D0v = pui32ADC0Value[0] * (3300.0 / 4095);
// Display the AIN0 (PE0) digital value on the console.
UART0printf("\n\r> D0 = %d mV", D0v); // If it's OK for you to display in mV
UART0printf("\n\r> D0 = %d.%03d V", D0v / 1000, D0v % 1000); // Print in V
没有像
这样的printf
格式字符串
%.2d
格式化程序%d
表示整数,因此它没有小数精度选项。 %.
被解析为错误(因为它不存在),2d
将其逐字输入到您的输出中。
The formatter for floating-point values is %f
, 所以:
%.2f
但是,所有这些都是基于这样的假设,即您在问题中没有指出的 UART0printf
与 printf
. 相同
我正在使用模数转换器读取从 0 到 3.3V 的电压值。 ADC 给出从 0x00
到 0x0FFF
(0 到 4095)的输出。我想打印带两位小数的电压读数。我已经阅读了很多答案,但我尝试过的都没有奏效。这是我的代码:
uint32_t pui32ADC0Value[1]; // ADC0 data value
double D0v; // Decimal value
// Read value from ADC
ADCSequenceDataGet(ADC0_BASE, 3, pui32ADC0Value);
// Convert to decimal
D0v = (double)pui32ADC0Value[0] / 4095 * 3.3;
// Print to console
UART0printf("\n\r> D0 = %.2d V", D0v);
我得到的输出是:D0 = ERROR2d V
pui32ADC0Value
打印没有任何问题并给出预期值,所以我知道它正在工作。
这个错误是什么意思?
注意:UART0printf
是我使用的 TIVA TM4C 微控制器上的预定义 UART 函数。
更新: 我错误地认为 UART0printf
与 printf
相同,因为我之前在 %u
、[=21] 中使用过它=],以及 %x
。但是,对于数字,它仅支持 %c
、%i
和 %u
。我正在重新编写我的代码,如果我没有任何进展,我会更新。
更新 2: 我可以做这样的事情吗?我知道它会错误地四舍五入...
uint32_t pui32ADC0Value[1]; // ADC0 data value
uint32_t D0v[2]; // Decimal value
// Read value from ADC
ADCSequenceDataGet(ADC0_BASE, 3, pui32ADC0Value);
// Convert to decimal
for ( int i = 0; i <= 2; i++){
D0v[i] = (pui32ADC0Value[0]/10^i) / 4096 * 3.3;
}
// Display the AIN0 (PE0) digital value on the console.
UART0printf("\n\r> D0 = %d.%d%d V", D0v[0],D0v[1],D0v[2]);
如果此功能有效printf
,例如:
UART0printf("\n\r> D0 = %.2f V\n", D0v);
此外,如果您使用以下代码,您的代码可能会运行得更快:
D0v = (double)pui32ADC0Value[0] * (3.3 / 4095);
编译器将预先计算 3.3 / 4095
并将执行单个浮点乘法运算。否则有可能首先完成除法(这通常比乘法需要更多 CPU 周期)然后乘法 * 3.3
将完成。
此外,由于您似乎只需要 2 位精度,因此您可以使用 float
(单精度)代替 double
。它可能执行得更快(但也可能更慢),这取决于平台。
问题中 UPDATE2 的更新:
试试这个:
uint32_t pui32ADC0Value[1]; // ADC0 data value
uint32_t D0v; // Decimal value
// Read value from ADC
ADCSequenceDataGet(ADC0_BASE, 3, pui32ADC0Value);
// Convert to millivolts
D0v = pui32ADC0Value[0] * (3300.0 / 4095);
// Display the AIN0 (PE0) digital value on the console.
UART0printf("\n\r> D0 = %d mV", D0v); // If it's OK for you to display in mV
UART0printf("\n\r> D0 = %d.%03d V", D0v / 1000, D0v % 1000); // Print in V
没有像
这样的printf
格式字符串
%.2d
格式化程序%d
表示整数,因此它没有小数精度选项。 %.
被解析为错误(因为它不存在),2d
将其逐字输入到您的输出中。
The formatter for floating-point values is %f
, 所以:
%.2f
但是,所有这些都是基于这样的假设,即您在问题中没有指出的 UART0printf
与 printf
. 相同