如何将uint32_t转换为double或float并打印?

时间:2015-11-13 21:44:05

标签: c embedded stellaris

我正在使用模数转换器读取0到3.3V的电压值。 ADC提供从0x000x0FFF(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功能。

更新:我错误地认为UART0printfprintf相同,因为我之前使用过%u%s和{ {1}}。但是对于数字,它仅支持%x%c%i。我正在重新编写我的代码,如果我没有到达任何地方,我会更新。

更新2: 我可以这样做吗?我知道它会圆错......

%u

2 个答案:

答案 0 :(得分:4)

如果此功能适用于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

答案 1 :(得分:2)

没有

这样的printf格式字符串
%.2d

格式化程序%d表示整数,因此没有小数精度选项。 %.被解析为错误(因为它不存在),而2d正逐字地输入到您的输出中。

The formatter for floating-point values is %f,所以:

%.2f

但是,所有这些都是基于这样一种假设,即您在问题中未识别的UART0printfprintf相同。