C语言各类型转化,可用于单片机

博客介绍了如何在STM32环境下将字符数组转换为浮点数,提供了手写的转换函数,并探讨了转换过程中可能出现的小数位误差问题。同时,给出了整型数据转字符串和浮点数转字符数组的方法,为STM32的数值处理提供了实用的代码示例。

 写stm32代码时需要用到char数组转float类型,网上找了一遍没找到合适的,于是手写了一个。

输入的字符数组用空格分开,最后一个数据也要有空格在后面

当小数位太多时会有一点点的误差,不知道怎么来的,有懂的大佬赐教一下

void  Decipher(uint8_t *data,float* result) {
	//uint8_t data[250] = "-9.5 12 48.56 15 664 ";
	//输入的数组用空格分开,最后一个数据最后也要有空格
	float dd = 0;							//计算结果
	//float result[20] = { 0 };
	float xiaoshudian = 0.100000000;
	unsigned char flat = 1;					//标记是整数还是小数
	float NorP = 1;							//标记是正数还是负数,1是正数,-1是负数
	unsigned char i = 0, j = 0;				//j是标志存入数组的位置
	while (data[i] != '\n' && data[i] != '\0') {

		if (data[i] != ' ')
		{
			if (data[i] == '-') {
				NorP = -1;
				i++;
				continue;
			}
			if (data[i] == '.') {
				flat = 0; i++;
			}
			if (flat == 1)dd = dd * 10 + data[i] - '0';			//是整数,按整数计算公式

			else {
				float k = (data[i] - '0') * xiaoshudian;		//是小数,按小数计算公式
				dd = (data[i] - '0') * xiaoshudian + dd;
				xiaoshudian = xiaoshudian * 0.1;
			}
		}
		else {
			flat = 1;
			dd = dd * NorP;			//乘以负号标记位
			NorP = 1;
			result[j++] = dd;		//存入结果数组
			xiaoshudian = 0.100000000;
			dd = 0;
		}
		i++;
	}
	//printf("%f", dd);
	//cout << "译码结果:" << result;
}

u_int8数组转float类型,转的结果存在数组中

void str2float(uint8_t *data,float* result)
{
 	float dd = 0;
	float xiaoshudian = 0.100000000;
	unsigned char flat = 1;
	float NorP = 1;
	unsigned char temp, i = 0, j = 0;
	while (data[i] != '\n' && data[i] != '\0' && data[i] != '\r' && j <= 2)
	{
		if (data[i] != ' ')
		{
			if (data[i] == '-') {
				NorP = -1;
				i++;
				continue;
			}
			if (data[i] == '.') {
				flat = 0; i++;
			}
			if (flat == 1)dd = dd * 10 + data[i] - '0';   //ÊÇÕýÊý

			else {
				float k = (data[i] - '0') * xiaoshudian;
				dd = (data[i] - '0') * xiaoshudian + dd;
				xiaoshudian = xiaoshudian * 0.1;

			}

		}
		else {
			flat = 1;
			dd = dd * NorP;
			NorP = 1;
			result[j++] = dd;
			xiaoshudian = 0.100000000;
			dd = 0;
		}
		i++;
	}
}

整形数据转字符串

char *itoa(int value, char *string, int radix)

radix=10表示10进制,非10进制转换结果为0

例:

d=-379;

itoa(d, buf, 10); 

得到结果为buf="-379"

char *itoa(int value, char *string, int radix)
{
    int     i, d;
    int     flag = 0;
    char    *ptr = string;

    /* This implementation only works for decimal numbers. */
    if (radix != 10)
    {
        *ptr = 0;
        return string;
    }

    if (!value)
    {
        *ptr++ = 0x30;
        *ptr = 0;
        return string;
    }

    /* if this is a negative value insert the minus sign. */
    if (value < 0)
    {
        *ptr++ = '-';

        /* Make the value positive. */
        value *= -1;
    }

    for (i = 10000; i > 0; i /= 10)
    {
        d = value / i;

        if (d || flag)
        {
            *ptr++ = (char)(d + 0x30);
            value -= (d * i);
            flag = 1;
        }
    }

    /* Null terminate the string. */
    *ptr = 0;

    return string;

}

float类型转char数组

void float2char(float value/*需要转换的值*/,char* cSendBuff/*结果存储数组*/, int Decimals/*小数位长度*/){
	int i = 1, k = 0;
	int integer = abs(value);//????
	int decimal = (fabs(value) - integer)*(int)pow(10, Decimals);//????
	int temp = integer;
	if (value < 0)cSendBuff[k++] = '-';//????0,????
	while (temp /= 10)
	{
		i*=10;
	}
	while (i) {
		cSendBuff[k++] = integer / i + '0';
		integer %= i;
		i /= 10;
	}
	if (Decimals == 0) {	//如果没有小数位,直接返回
		cSendBuff[k++] = '\0';
		return;
	}
	cSendBuff[k++] = '.';    //加上小数点
	temp = decimal;
	i = 1;
	while (temp /= 10)
	{
		i *= 10;
	}
	while (i) {
		cSendBuff[k++] = decimal / i + '0';
		decimal %= i;
		i /= 10;
	}
	cSendBuff[k++] = '\0';
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值