Member 13892404 Ответов: 2

Попытка печати значений с плавающей запятой в реальном времени на жидкокристаллическом дисплее с помощью spi


Привет,

Я использую sprintf для форматирования строки, содержащей значения с плавающей запятой в реальном времени. Затем я передаю формализованную строку в качестве аргумента функции SPI data trasnfer для записи на ЖК-дисплей. Я сталкиваюсь с проблемой с заменой переменных реального времени float в %.2f в моей строке. Это следующий фрагмент кода

Что я уже пробовал:

float Ref1,Iref1;

char buffer1[20];

char stringC[20];

sprintf(buffer1,"%.2f VDC %.2f A",Ref1,Iref1);

strcpy(stringC,buffer1);


После этого я передаю stringC в качестве аргумента и выполняю передачу SPI.

Я ожидаю прочитать что-то вроде на жидкокристаллическом дисплее,
20.20 В ПОСТОЯННОГО ТОКА 10.08 А

вместо этого я в конечном итоге получаю это,
2Ф 2Ф в постоянного тока в

Подмена никогда не происходит !! есть идеи, что я могу делать неправильно?

Спасибо,
Подключат интернет

2 Ответов

Рейтинг:
1

OriginalGriff

Я сам попробовал это сделать с помощью онлайн компилятора языка Си:

int main()
{
    float f = 20.20, g = 10.08;
    char buff[100];
    printf("%.2f %.2f\n", f, g);
    sprintf(buff, "%.2f %.2f\n", f, g);
    printf(buff);
    return 0;
}
И получил именно то, что ожидал:
20.20 10.08                                                                                                                                                  
20.20 10.08
Проверьте специальную документацию для вашего компилятора и строку формата printf / sprintf - в ней могут быть некоторые странности. Также пробовать:
sprintf(buff, "%0.2f %0.2f\n", f, g);
И посмотрим, исправит ли это ситуацию.


Member 13892404

Спасибо. Но у меня есть продолжение. Относится ли это только к константам? что произойдет, если это плавающая переменная, которая изменяется в реальном времени? Потому что именно так я установил его в своей прошивке. Я ожидаю, что мои вольты и ток будут постоянно меняться, и хочу, чтобы мой ЖК-дисплей печатал их в режиме реального времени динамически.

OriginalGriff

Те являются переменные с плавающей запятой...

Member 13892404

Вы случайно не знаете, как я могу усечь результат с плавающей точкой в виде целого числа?? я помню, как использовал fabs() для преобразования отрицательных значений float в положительные. существует ли аналогичная функция для преобразования float в целое число?

OriginalGriff

Как говорит Рик - вы можете просто бросить его:

int x = (int) myfloat;

Rick York

Ничего не будет "происходить" - ценность будет просто другой. Функция sprintf не знает и не заботится о том, являются ли значения, которые она видит, константами или нет - она будет считать их просто значением в стеке, которое она не изменит. Вам придется либо отправлять данные, либо запрашивать их с устройства достаточно часто, чтобы увидеть их изменение.

Member 13892404

Понял ! Спасибо

Рейтинг:
0

CPallini

Если вы используете SPI тогда вы, вероятно, используете микроконтроллер. Теперь, в библиотеках микроконтроллеров, может случиться так, что sprintf реализации не являются полнофункциональными. Проверьте документацию компилятора.
Обратите внимание, что обработка значений с плавающей запятой может быть тяжелой задачей, особенно при низких ресурсах 8 бит и 16 немного MCUs. Вместо этого часто можно использовать правильно масштабированную целочисленную арифметику.


Member 13892404

Да, я использую микроконтроллер TI C2000 concerto. Платформа, которую я кодирую, находится в CCS, я прошел через все рекомендации при использовании операций ввода-вывода C в CCS. Я изменил область действия библиотечных функций, улучшил размер стека и размер кучи, чтобы при использовании функции sprintf у меня не заканчивалась память. Я также включил необходимые заголовочные файлы.

Я обновил свою попытку следующим образом, и она по-прежнему ничего не меняла,

функции sprintf(строках,"%0.2 F для постоянного тока",Actual_Voltage);
sprintf(stringB,"%0.2 f A",Actual_Current);
sprintf(buffer1,"%s %s",stringA,stringB);
strcpy(stringC,buffer1);

он печатает
.2-ой этаж В постоянного тока .2-ой этаж в

Member 13892404

Да, это, кажется, прекрасно работает для целых чисел. Но не печатает поплавок.

CPallini

Не должно быть трудно работать с целочисленной математикой, используя сотые числа.

Member 13892404

когда я преобразовал типы данных в целые числа, он выводит желаемые результаты. Но я пытаюсь спроектировать очень чувствительное устройство преобразователя мощности, управляемое IGBT, и моя обратная связь очень чувствительна даже к небольшим изменениям напряжения. И поэтому игнорировать значение после десятичной дроби было бы нежелательно. Хотя, если дело дойдет до драки, мне, возможно, придется согласиться на это. Может быть, вы знаете функцию, которая усекает результат с плавающей запятой в целое число??

CPallini

Обычно вам на самом деле не нужны значения с плавающей запятой (например, если у вас есть датчик с разрешением микровольт, то вы, вероятно, измеряете милливольты, поэтому 16-битного целого числа будет достаточно. С другой стороны, если вам действительно нужны значения с плавающей запятой, то вы можете выполнить вычисления, используя их, и в конце вычисления преобразовать их в целые числа (правильно масштабированные), чтобы удовлетворить требованиям представления данных.

Member 13892404

Понял ! Спасибо

CPallini

Добро пожаловать.