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"