Преобразование 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);
Другие вопросы по тегам