C语言求x的n次幂 ASCII码字符数组转为对应数值(浮点型)

前言

  以下是最近一个小项目所需要的功能demo:在串口屏上设置参数时,串口屏通过uart向单片机发送指令(如程序中 的rxArray),单片机接收到指令后需要对其进行解析并转换为数值,并修改程序中的变量值ratioArray。

  举个栗子:

  我在屏幕上设置了:999.12

  那么屏幕会向单片机发出指令:0xEE, 0xB1, 0x11, 0x00, 0x09(屏幕画面ID), 0x00, 0x01(控件ID), 0x11, 0x39, 0x39,0x39, 0x2E, 0x31, 0x32, (999.12对应的ASCII码 0x2E为小数点.)0x00, 0xFF, 0xFC, 0xFF, 0xFF,

  0x11到0x00之间为需要解析的数值。

  单片机收到指令后对其进行解析,并更新ratioArray中对应控件ID ratioArray[<控件ID>]的参数数值

  以下是程序DEMO,可直接运行:

#include<stdio.h>
void weightRatioFromHMI(unsigned char *_rxArray, float *_ratioArray);
unsigned char rxArray[19] = { 0xEE, 0xB1, 0x11, 0x00, 0x09, 0x00, 0x01, 0x11, 0x39, 0x39,
0x39, 0x2E, 0x31, 0x32, 0x00, 0xFF, 0xFC, 0xFF, 0xFF,
};
float ratioArray[10] = {
    0.0, 1.1, 2.0, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9,
};
int main()
{
    weightRatioFromHMI(rxArray, ratioArray);
    return 0;
}

float power(float x, int n)   // n power of x
{
    int i;
    float s = 1.0;
    for (i = 1; i <= n; i++) //if i < 1 does not enter the loop, s is 1.
        s *= x;
    return s;//returns the multiplier result
}

void weightRatioFromHMI(unsigned char *_rxArray, float *_ratioArray)
{
    //EE B1 11 00 09 00 01 11   39 39 39 2E 31 32   00 FF FC FF FF  (屏幕上设置参数时发出的16进制字符,对应999.12)
    //EE B1 11 00 09 00 02 11   31 32 2E 33 30      00 FF FC FF FF  (屏幕上设置参数时发出的16进制字符,对应12.30)
    if (_rxArray[4] == 0x09 && _rxArray[7] == 0x11)//判断屏幕画面ID是否是第9,
    {
        int ctrId = ((int)_rxArray[6]) % 10; //获取控件ID
        int i, j;
        unsigned char getIntSumFlag = 0;//是否获取到小数点并计算出整数部分TODO:unsigend char ---> bool
        int decimalOrder, zeroOrder;// 小数点(0x2E)及0x00在收到的字符数组中的位置
        float intSum = 0.0, floatSum = 0.0;//整数部分 及小数部分的和
        for (i = 8; i < 19; i++) //0x11 到 0x00 之间的字符为所设置数值的ASCII码 从8th开始,最多19个字符
        {
            if (!getIntSumFlag && _rxArray[i] == 0x2e)//0x2E为小数点的ASCII码
            {
                decimalOrder = i;//获取小数点在数组中的位置
                for (j = decimalOrder - 1; j >= 8; j--)
                {
                    intSum += (_rxArray[j] - 0x30) * power(10, decimalOrder - 1 - j);//计算整数部分
                }
                getIntSumFlag = 1;//置标志位
            }
            if (_rxArray[i] == 0x00)
            {
                zeroOrder = i;
                for (j = zeroOrder - 1; j > decimalOrder; j--)
                {
                    floatSum += (_rxArray[j] - 0x30) * power(10, zeroOrder - 1 - j);//Calculate the sum of float parts
                }
                floatSum /= (power(10, zeroOrder - decimalOrder - 1)) + 0.005;
                floatSum += 0.005;
                _ratioArray[ctrId] = intSum + floatSum;
                break;
            }
        }
    }
    return;
}
One day,I will say "I did it"
原文地址:https://www.cnblogs.com/Vince-Wu/p/11752221.html