从ADC转换uint16翻转为负

时间:2013-11-07 23:02:50

标签: c adc itoa atmega16 uint16

我想做什么: 将生成的16位数字(在将两个8位#组合后)转换为字符串,以便与我的串行发送功能一起使用

问题: 当使用itoa时,一旦它通过中间点(从第15位传递到第16位),结果就变为负数,所以它基本上使用第16位作为符号位(不足为奇),其中我的数字应该是无符号的。 sprintf也这样做。请注意itoa(16)完美无缺,应该如此。

硬件: atmega16微处理器(AVR c) 通过SPI总线连接的16位外部ADC(将ADC结果作为两个8位数发送)

代码:

uint16_t ADC_result = ADC_data_LSB | (ADC_data_MSB<<8); // Combine both halves of the data
unsigned char *outString = "0123456789abcdef";
itoa(ADC_16_result, outString, 10);
send_A_String(outString);

这样做的结果是它打印了一个15位的签名而不是原始的uint16。我一直在使用itoa来打印10bit内部ADC的结果,但这让我感到很困难,因为这么简单的事情让我花了这么长时间。

我非常感谢你的时间。

1 个答案:

答案 0 :(得分:3)

如果你有sprintf

char outString[10];
sprintf(outString, "%hu", ADC_result);

或者,如果你的整数是16位

sprintf(outString, "%u", ADC_result);