Странное поведение printf на stm8l с COSMIC-компилятором - PullRequest
1 голос
/ 07 июля 2019

printf дает мне странные дополнительные значения в некоторых случаях.Что может происходить?

Я манипулирую значениями в массиве uint8_t и распечатываю их на свой терминал, чтобы проверить, все ли правильно.Но по какой-то причине я получаю странные значения при печати uint8_t - я получаю ожидаемое значение плюс некоторое другое значение (это всегда одно и то же дополнительное значение), как если бы я печатал uint16_t или другое 16-битное значение.Я обрезал все до следующего примера:

Это тестовый код

test_payload[0] = (uint8_t)0x58;
test_payload[1] = (uint8_t)0x7B;
test_payload[2] = (uint8_t)0x6B;
test_payload[3] = (uint8_t)0x05;
test_payload[4] = (uint8_t)0x4F;
test_payload[5] = (uint8_t)0x81;
test_payload[6] = (uint8_t)0x69;
test_payload[7] = (uint8_t)0x00;

printf("%x\n\r", test_payload[0]);
printf("%x\n\r", test_payload[1]);
printf("%x\n\r", test_payload[0] + test_payload[1]);

for(i = 0; i < 8; i++)
{
    printf("%x", test_payload[i]);
}

Я получаю вывод

5803
7b03
d3
58037b0333034f03810369033

Что заставляет его вести себя какчто?

Ответы [ 2 ]

2 голосов
/ 07 июля 2019

Первый фрагмент кода должен выдавать 58, но вы не выводите новую строку, поэтому любой последующий вывод будет отображаться сразу после 58.Возможно, вы вывели 86 в коде, который следует за фрагментом.Разместите полную программу, которая демонстрирует оскорбительное поведение, или измените формат на %x\n, чтобы отделить 58 от последующего вывода.

Технически, printf ожидает аргумент unsigned int для преобразования %xформат, но значение int должно работать нормально, а test_payload[0] повышается до int и передается как таковое printf.Вы можете попробовать изменить формат на %hhx или привести аргумент к (unsigned int)test_payload[0], но было бы очень удивительно , что только одно из этих изменений решило проблему.

РЕДАКТИРОВАТЬ: из вашей дополнительной информации, похоже, что компилятор для вашей встроенной цели очень своеобразен.Определенно попробуйте привести аргументы как в

printf("%x\r\n", (unsigned int)test_payload[0]);

Заметив, что printf("%x\n\r", test_payload[0] + test_payload[1]);, кажется, работает нормально, проблема не в том, чтобы передать int вместо unsigned int, что было бы достаточно плохо ..Кажется, printf() передает uint8_t значения неправильно, несоответствующим образом.

Еще один потенциальный источник проблем - если вы забыли включить <stdio.h> и вызываете printf без определения спрототип.Стандарт C ( 6.5.2.2 Вызовы функций ) явно определяет этот вызов как неопределенное поведение, если функция определена (в библиотеке) с прототипом, включающим многоточие (* 1039)*).

2 голосов
/ 07 июля 2019

%x требует unsigned int в качестве параметра;Если вы хотите напечатать один байт, например uint8_t, вам нужно написать %hhx.

...