zoukankan      html  css  js  c++  java
  • 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"
  • 相关阅读:
    我的书单
    算法面试 字符串全排列
    各种算法面试简介--面试用一句话陈述
    逻辑回归 面试
    EM算法 小结
    python实现 单链表的翻转
    Transformer模型总结
    逻辑回归原理 面试 Logistic Regression
    XGBoost的优点
    python-解决pip安装速度慢的问题--豆瓣镜像
  • 原文地址:https://www.cnblogs.com/Vince-Wu/p/11752221.html
Copyright © 2011-2022 走看看