Преобразование uint16 из АЦП отрицательно отражается
Что я хочу сделать: превратить полученное 16-битное число (после объединения двух 8-битных #) в строку для использования с моей функцией последовательной отправки
Проблема: при использовании itoa результат становится отрицательным, как только он проходит половину путевой точки (переходя с 15-го на 16-й), поэтому он по существу использует 16-й бит в качестве знакового бита (неудивительно), где мое число считается беззнаковым, sprintf также делает это. Обратите внимание, что itoa(16) работает отлично, как и должно.
Аппаратное обеспечение: микропроцессор atmega16 (AVR c) 16-битный внешний АЦП, подключенный через шину SPI (отправляет результат АЦП в виде двух 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. Я использовал Итоа для печати результатов 10-битного внутреннего АЦП, но меня убивает, что что-то такое простое занимает у меня так много времени.
Я действительно ценю ваше время.
1 ответ
Если у вас есть sprintf
char outString[10];
sprintf(outString, "%hu", ADC_result);
Или, если ваши целые 16 бит
sprintf(outString, "%u", ADC_result);