版主
  
- 积分
- 12512
- 金钱
- 12512
- 注册时间
- 2015-11-5
- 在线时间
- 2144 小时
|
发表于 2016-8-19 13:38:52
|
显示全部楼层
本帖最后由 FreeRTOS 于 2016-8-21 01:06 编辑
不知道你有没有接触过GPS,GPS通过串口输出的数据以逗号分隔,每个字段的长度也是不定的,而且包含整数和小数,由于公司的代码不能公开,所以我只能说下大致算法你参考下:
先定义3个可以存放介电常数,电导率,温度值三个字符串字段信息的数组:
struct DataStringStructure
{
char jiedian[16];
char diandao[16];
char wendu[16];
};
struct DataStringStructure DataStrInfo1; // 用于存放第1个传感器的所有字符串字段
struct DataStringStructure DataStrInfo2; // 用于存放第2个传感器的所有字符串字段
struct DataStringStructure DataStrInfo3; // 用于存放第3个传感器的所有字符串字段
当接收到字符串信息时,使用switch并以'+'作为分隔,将3个字段信息分别存储到结构里面,上面定义的3个结构体变量分别用于存放你的3路传感器发过来的字符串信息,如果连分隔算法都不会的话最好找个C语言算法扎实点的人帮你。
假设最后分离出来的信息(伪代码)是:
DataStrInfo1.jiedian[] = 134.9761 // 注意是字符串,不是数值
DataStrInfo1.diandao[] = 888.3107 // 注意是字符串,不是数值
DataStrInfo1.wendu[] = 35.625 // 注意是字符串,不是数值
同理DataStrInfo2和DataStrInfo3也是类似的字符串信息,当把3个结构字符串都存放起来后,下面进行最重要的一步:转换
转换前先定义转换后存储数据的结构(假设3个数据都是float类型):
struct DataValStructure
{
float jiedianVal;
float diandaoVal;
float wenduVal;
};
struct DataValStructure DataVal1; // 用于存放第1个传感器的所有参数数值
struct DataValStructure DataVal2; // 用于存放第2个传感器的所有参数数值
struct DataValStructure DataVal3; // 用于存放第3个传感器的所有参数数值
如何将字符串转成数值呢?最简单的方法当然是使用C库,当然也可以自己写一个字符串转浮点的函数,先介绍C库的2个比较好用的字符串转数值函数:atoi() 和 atof()
由于你的数值都是float类型的,因此使用 atof() 就可以了,如果有整型数据的话就是用 atoi()
DataVal1.jiedianVal = atof(DataStrInfo1.jiedian); // 注意这里的转换结果134.9761是数值不是字符串!
DataVal1.diandaoVal = atof(DataStrInfo1.diandao); // 注意这里的转换结果888.3107是数值不是字符串!
DataVal1.wenduVal = atof(DataStrInfo1.wendu); // 注意这里的转换结果35.625是数值不是字符串!
好了,第一个数据已经转换出来了,照葫芦画瓢完成 DataVal2 和 DataVal3 的转换就大功告成了,最后的求平均值总知道怎么算吧?!
最后当一回活雷锋提供本人写的浮点字符串转数值函数:
[mw_shl_code=applescript,true]uint32_t Power(uint8_t m, uint8_t n)
{
uint32_t result=1;
while(n--)
{
result *= m;
}
return result;
}
uint32_t Char2Oct(char* src, uint8_t len)
{
uint32_t num;
uint32_t i=1;
num = (src[len-1] - '0');
len--;
while(len)
{
i *= 10;
num += (src[len-1]-'0')*i; // 个位
len--;
}
return num;
}
float Char2Float(char* src)
{
uint8_t i = 0;
uint8_t j = 0;
float result;
/* 获取字符串的长度与小数点的偏移 */
while(src != 0)
{
if(src == '.')
{
j = i; // 记录小数点出现的位置
}
i++;
if(i > 10) // 防卡死处理
{
i--;
break;
}
}
/* 转换整数部分 */
result = Char2Oct(&src[0], j);
/* 转换小数部分并整合成一个完整的浮点数 */
result += (float)Char2Oct(&src[j+1], i-j-1) / Power(10, i-j-1);
/* 返回转换结果 */
return result;
}[/mw_shl_code]
|
|