#c #binary #embedded #microcontroller #fixed
#c #двоичный #встроенный #микроконтроллер #исправлено
Вопрос:
Я так близок к тому, чтобы выводить данные на мой ЖК-дисплей по желанию. Проблема в том, что когда я извлекаю цифры из целого числа, чтобы цифры были целыми, а остаток — моей дробью, я, похоже, не могу получить правильный вывод.
До десятичного числа вывод выглядит нормально, но после — нет.
void ST7735_uBinOut8(uint32_t n){
uint32_t value2;
value2 = n;
char integer2[2];
char fraction2[4];
uint32_t f_part2 = abs(value2)%256;
uint32_t i_part2 = ((abs(value2)) /256) ;
if (abs(value2) > 256000U)
{
integer2[0] = '*';
integer2[1] = '*';
fraction2[0] = '*';
fraction2[1] = '*';
fraction2[2] = '*';
fraction2[3] = '*';
}
else
{
if (abs(value2) < 256000U)
sprintf(integer2, "%d", i_part2);
sprintf(fraction2, "%.3d", f_part2);
}
printf("%s.%s", integer2, fraction2);
Ниже приведены значения, которые я передаю этой функции:
outTestCaseType2 outTests2[14]={
{ 0, " = 0.00?r" }, // 0/256 = 0.00
{ 4, " = 0.01?r" }, // 4/256 = 0.01
{ 10, " = 0.03?r" }, // 10/256 = 0.03
{ 200, " = 0.78?r" }, // 200/256 = 0.78
{ 254, " = 0.99?r" }, // 254/256 = 0.99
{ 505, " = 1.97?r" }, // 505/256 = 1.97
{ 1070, " = 4.17?r" }, // 1070/256 = 4.17
{ 5120, " = 20.00?r" }, // 5120/256 = 20.00
{ 12184, " = 47.59?r" }, // 12184/256 = 47.59
{ 26000, " = 101.56?r" }, // 26000/256 = 101.56
{ 32767, " = 127.99?r" }, // 32767/256 = 127.99
{ 34567, " = 135.02?r" }, // 34567/256 = 135.02
{255998, " = 999.99?r" }, // 255998/256 = 999.99
{256000, " = ***.**?r" } // error
};
Ниже приведен снимок экрана моего вывода, а столбец справа от меня — это то, что я должен получить.
ВЫВОД ИЗОБРАЖЕНИЯ
Комментарии:
1. Подумайте, что делает оператор по модулю и почему это вызывает вашу проблему.
2.
sprintf
попытается создать строки с нулевым завершением, но вы не используете нулевые терминаторы и не выделяете для них место.
Ответ №1:
Я исправил это, поиграв с операторами. Я изменил на следующее, и, похоже, он работает и получает желаемый результат примерно через 4 часа, но я уверен, что 4 часа идут на то, чтобы я учился, и это борьба новичка, но все в порядке.
void ST7735_uBinOut8(uint32_t n){
uint32_t value2;
value2 = (n*1000)/256;
char integer2[2];
char fraction2[4];
uint32_t f_part2 = abs(value2)%1000;
uint32_t i_part2 = ((abs(value2)) /1000) ;
//f_part2 = abs(f_part2)00;
// i_part2 = abs(i_part2) /1000 ;
if (abs(n) >= 256000U)
{
integer2[0] = '*';
integer2[1] = '*';
fraction2[0] = '*';
fraction2[1] = '*';
fraction2[2] = '*';
fraction2[3] = '*';
}
else
{
if (abs(n) < 256000U)
sprintf(integer2, "%d", i_part2);
sprintf(fraction2, "%.3d", (f_part2));
}
printf("%s.%.2s", integer2, fraction2);
}
Это мой вывод сейчас: IMG