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.

[参考译文] MSP430FR2033:为什么参数类型"float"与参数"不兼容;float"

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1229900/msp430fr2033-why-is-the-argument-type-float-not-compatible-with-parameter-float

器件型号:MSP430FR2033

大家好!

我正在创建一个将十六进制转换为十进制的函数。 该函数假设接受参数、它转换参数(十六进制)并返回参数(十进制)。 当我执行该函数时、我收到一条错误消息、指出类型不匹配。 我想转换类型以缓解该问题。 该参数来自压力传感器。 压力传感器以 uint32_t 形式返回、我还获取该数据的移动平均值、这些数据以浮点数形式返回。 我需要将这两个值转换为十进制。 我尝试在函数中更改数据类型以匹配压力数据。 这不奏效。 我希望保持压力数据不变。

以下是位于源文件中的函数代码:

 float Hex2Dec(float hex[17])
    {
        long decimal; // return value
        long place;
        int i = 0;    // iterator
        int val;
        int len;
        decimal = 0;
        place = 1;

    // Find total length of Hex number
    // Go to the beginning of the number
        len = strlen(hex);
        len--;

    // Iterate over the number
        for (i = 0; hex[i] != '\0'; i++)
        {
        // Find decimal representation of hex[i]
            if (hex[i] >= '0' && hex[i] <= '9')
            {
              val = hex[i] - 48;
            }
            else if (hex[i] >= 'a' && hex[i] <= 'f')
            {
                val = hex[i] - 97 + 10;
            }
            else if (hex[i] >= 'A' && hex[i] <= 'F')
            {
                val = hex[i] - 65 + 10;
            }
            decimal += val * pow(16, len);
            len--;
            }
            return decimal;
         }`

Here is the header file:
`    float Hex2Dec(float hex[17]);
`

Here is the code used in my main file:

`    // These are global variables
    static uint8_t Press0[4] = {0xFFU, 0xFFU, 0xFFU, 0xFFU};
    static uint32_t bridge_data0;
    static uint32_t pressure0;
    static uint32_t temp_data0;
    static uint32_t temperature0;
    // this is a local variable inside a switch case function
    // the rest of the case function is irrelevant
    mvg_avg_p0 = MovingAvg(pressure0);

    Hex2Dec(pressure0);
    Hex2Dec(mvg_avg_p0);
    
    *((uint32_t*)Press0) = i2cReadHWPressureTemp(4); // channel 2 (2^2 = 4)
    bridge_data0 = ((uint32_t)(Press0[0] & ~STATUS_MASK) << 8) | Press0[1];
    pressure0 = ((bridge_data0 - OUTPUT_MIN)*(PRESSURE_MAX_001BA - PRESSURE_MIN_001BA))/ (OUTPUT_MAX - OUTPUT_MIN) + PRESSURE_MIN_001BA;
    temp_data0 = ((uint32_t)(Press0[2]) << 8) | ((uint32_t)(Press0[3] >> 5));
    temperature0 = (((temp_data0/2047)*200) - 50);
`

我迷路了。 有人能帮忙吗?

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

    您似乎对实际的十六进制类型[]感到非常困惑。 您将其声明为浮点型、但将其视为字符串。 使用 strlen()并与 ASCII ('A')值进行比较。 这种方法永远不会起作用。

    此外、转换为浮点可能是浪费精力。 您可以使用移动平均法轻松生成定点数。 只需使用2个样本的幂(2、4、8等)即可获得额外的小数位。

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

    虽然我们可以回答具体问题、但有关 C 语言的基本教程不在本电路板的讨论范围之内。 我建议您阅读一些 C 语言教程。 K&R 仍然很好、但很简洁。

    另外、我不确定十进制代表什么。 它看起来意味着一个 ASCII 字符串。 sprintf()可以为您做到这一点,

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

    我之前把它宣布为一个字符、但我转而认为它会解决问题。  

    您使用2个样本的幂是什么意思?

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

    我了解。 我有点挣扎,所以我认为我可以来这里寻求这种帮助。 堆栈溢出给我带来问题。  

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

    十进制表示以10为底的数字系统

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

    是的,但小数*什么*? 您想用它做什么? 在 C 中、唯一相关的时基是在输出数据时、例如创建字符串。

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

    可以说十进制、但转换为二进制。

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

    就像我举的例子一样。 将这些值相加、得到的只是整数部分、再除以样本数。 但如果样本数是2的幂、则会使用快速得多的位移位。 如果您需要小数位、请使用它们。 大量资源、只需在网络上搜索定点即可。

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

    Anish、您好!

    我认为有一部分困惑是你为什么这样做。 MCU 并不关心数字的基数是多少、您可以将整数设置为二进制、十六进制、十进制、不管怎样、它们都以二进制方式存储。 此数据的最终目标是什么?您是要将其输出到某个位置还是要使用它? 您还如何获取这些数据、是通过通信接口获得的数据、还是您对其进行了硬编码。

    对于该错误、您可以将该参数设置为浮点数组、但随后输入 uint32_t 参见第54行。 我看不到第55行的数据类型、因此无法添加注释、但我会再次检查其中的输入。 您可以键入转换输入为浮点、但在我看来、所有数据类型都应该是整数而不是浮点。 此外、就像其他评论一样、您将其视为字符串、因此、使用字符数组输入代替浮点数组更有意义。

    此致、

    Luke

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

    更加可能的是、uknowledge I2C 器件会返回32位整数而不是四位字符串。 说到哪一种、这是转换代码的另一种故障模式。 这个四位数字符串之后是否有零? 该变量中当然没有空间容纳它。 这意味着 strlen 将返回一个垃圾值。