从 ADC 转换 uint16 翻转为负

标签 c adc itoa atmega16 uint16

我想做什么: 将生成的 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/

相关文章:

gcc - STM32 ADC 连续转换模式不会自动启动转换

c++ - 格式化 : how to convert 1 to “01” , 2 到 “02” , 3 到 "03",等等

c++ - 有 GetModuleThreadId 函数吗?

c - 与 PIC18F252 上的 ADC 输出作斗争

c - Beagle 骨 ADC 读取值

c++ - unsigned int 转换为 char 数组。 itoa 的替代品?

c++ - _itoa 和 itoa 有什么区别?

c - 如何确定 union 中使用的是什么类型?

c - Linux 原始套接字缓冲区大小是否有 256 K 的上限?

c - 打印 "Success"的最短路径