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

被折叠的 条评论
为什么被折叠?



