This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/F28M36P63C2:sprintf 会产生不良结果

Guru**** 2937200 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/707112/ccs-f28m36p63c2-sprintf-producing-undesired-results

器件型号:F28M36P63C2

工具/软件:Code Composer Studio

您好!

我正在尝试使用 sprintf 通过 SPI 在 LCD 显示屏上打印实时浮动变量。 下面是我设置字符串格式的代码片段、

float actual_Voltage、actual_current;
char buffer1[17];
char stringA[8];
char stringB[8];
char stringC[17];

sprintf (stringA、"%0.2f VDC"、actual_Voltage);
sprintf (stringB、"%0.2f A"、actual_current);
sprintf (buffer1、"%s %s"、stringA、stringB);
strcpy (stringC、buffer1);

现在、

我希望看到这样的输出

"2.33V VDC 和10.23A"

电压和电流值持续实时变化。

但我的输出看起来是这样的

0.2f VDC .2f A

为什么会发生这种情况? 我已将 sprintf 设置为最小值、从而提高了堆栈和堆大小、并遵循 C I/O wiki 页面中的指导原则进行 printf 操作。 我已包含必要的头文件。 我无法对格式化此字符串时可能执行的操作进行零操作。 液晶屏工作正常、我也能完美地打印其他所有内容。 仅打印实时浮点变量和 sprintf()时出现问题。

谢谢、

Srini.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Srini,

    请尝试一下

    sprintf ("%0.2f VDC 和%0.2f A"、actual_Voltage、actual_current);

    而不是堆栈式 sprintf()调用? 我不确定这是不是原因、但值得一试、我已在该主题中添加了另一位软件专家、以查看他们是否也能提供帮助。

    -Mark
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Mark、

    感谢您的参与和帮助。 我尝试了您的方法、它给了我一个类型不兼容的错误。
    说明资源路径位置类型
    类型为"float"的#169参数与类型为"const char *"的参数 CTC_PC3main_c28.c/CCC_PC3_c28revA第1364 C/C++行问题不兼容

    但我解决了这个问题,将浮点数分为两个不同的值,然后用“”手动打印。 在中间。 如所示、

    假设我要打印3.27。 我在 a 中存储3、在 b 中存储27。然后我打印"a.b"、并使用 sprintf 获取浮点值。 这给了我我我需要的东西,但我对这种做法不满意。 但如果推入分流器、我找不到更好的解决方案、我必须解决这个问题。

    再次感谢、
    Srini.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Srini,

    您说过您使用的是最低的 printf 支持吗? 我认为%f 不受最小值支持。

    processors.wiki.ti.com/.../Printf_support_in_compiler

    惠特尼
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Whitney、

    感谢您抽出宝贵的时间为您提供帮助。 我尝试了完整设置、当我尝试时、出现以下错误

    说明资源路径位置类型
    #10010链接期间遇到错误;"CTC PC3_c28revA.out"未构建CTC PC3_c28revAC/C++问题

    程序将不能放入可用的内存中。 对齐/分块方式放置在".text"大小为0x2643页0的位置失败。 可用存储器范围:F28M36x_generic_C28_flash.cmd/CTC _PC3_c28revA第105行C/C++问题

    它内存不足。 因此、我一直在尝试最小设置。 但我现在了解到、最小设置不会促进浮点。 您是否会碰巧知道、我可以在全 sprintf 模式下修复上述错误??

    再次感谢、
    Srini.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您需要编辑您的 cmd 文件以为.text 分配更多空间。 您可以在 CCS 中使用"Memory Allocation"视图来更轻松地找到未使用的空间。

    惠特尼
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我明白、非常感谢。 它当前位于 FLASHA 中、大小为0x001F80。 因此它小于.text 文件的大小。 是否建议将其放入闪存 J-闪存 F (0x008000)?

    谢谢、
    基尼
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Srini,

    如果您有可用的内存、则可以将其放置在合适的位置。 以下是一些可帮助您更好地了解链接器的资源。

    processors.wiki.ti.com/.../C28x_Compiler_-_Understanding_Linking
    processors.wiki.ti.com/.../Linker_Command_File_Primer
    processors.wiki.ti.com/.../Linker_CMD_Files_for_CCS

    谢谢、
    标记
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢、Mark 和 Whitney。 感谢您在这方面的时间和帮助。 这解决了我的问题!!