我想做的事:将最终的16位数字(将两个8位#S之后)变成一个字符串,以与我的串行发送函数一起使用

问题:当使用ITOA时,结果一旦通过了一半点(从第15位到16位)就会变为负,因此本质上是使用第16位作为符号位(毫不奇怪),而我的号码应该不符合签名。 Sprintf也这样做。请注意,ITOA(16)正常工作。

硬件:ATMEGA16微处理器(AVR C)16位外部ADC通过SPI总线连接(发送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);

或者,如果您的int是16位

sprintf(outString, "%u", ADC_result);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top