我想做什么: 将生成的 16 位数字(在将两个 8 位#s 组合之后)转换为一个字符串以用于我的串行发送功能
问题: 使用 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 来打印 10 位内部 ADC 的结果,但让我很伤心的是,这么简单的事情却花了我这么长时间。
非常感谢您的宝贵时间。
最佳答案
如果你有sprintf
char outString[10];
sprintf(outString, "%hu", ADC_result);
或者,如果您的整数是 16 位
sprintf(outString, "%u", ADC_result);
关于从 ADC 转换 uint16 翻转为负,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19848497/