Modbus流量计数据解析:4个字节到float的三种转换方法
创作时间:
作者:
@小白创作中心
Modbus流量计数据解析:4个字节到float的三种转换方法
引用
CSDN
1.
https://m.blog.csdn.net/weixin_46461874/article/details/139782979
在工业自动化领域,Modbus协议是一种常用的通信协议,广泛应用于各种设备的数据采集和控制。本文以天信流量计为例,详细介绍了如何将通过Modbus协议读取的4个字节数据转换为float类型,包括三种具体实现方法:使用char*逐字节解析、使用memcpy转换以及使用联合体union转换。
通过Modbus协议从流量计中读取数据后,需要将获得的字节数据合成float类型。以天信流量计为例:
如何将字节数据合并成float类型呢?这里总结了三种方法。
以温度值41 A0 00 00为例
1、使用char*逐字节解析
float为4个字节,将这4个字节依次解析用获取的温度值数据进行替换,就能够完成转换。
但是需要注意的是,协议帧中除了校验位CRC,其余都是高位在前,单片机以及PC端都是小端存储,高位字节数据应该放在高地址处,如下图所示
代码:
char data[]={0x41,0xA0,0x00,0x00};
int main() {
float data_conver;
*((char*)(&data_conver))=data[3];
*((char*)(&data_conver)+1)=data[2];
*((char*)(&data_conver)+2)=data[1];
*((char*)(&data_conver)+3)=data[0];
printf("data_conver=%f\r\n",data_conver);
system("pause");
return 0;
}
结果:
2、使用memcpy转换
因为高字节在前,因此直接使用memcpy进行复制内容时,需要先将获取的字节数据倒序
代码:
//char data[]={0x41,0xA0,0x00,0x00};
char data[]={0x00,0x00,0xA0,0x41};
int main() {
float data_conver;
memcpy(&data_conver,data,sizeof(data_conver));
printf("data_conver=%f\r\n",data_conver);
system("pause");
return 0;
}
结果:
2、使用联合体union转换
联合体union中的数据共用同一段内存,可以使用这个特性对数据进行类型转换
代码:
char data[]={0x41,0xA0,0x00,0x00};
union FourBytes{
char bytes[4];
float data_conver;
};
int main() {
union FourBytes a;
a.bytes[0]=data[3];
a.bytes[1]=data[2];
a.bytes[2]=data[1];
a.bytes[3]=data[0];
printf("data_conver=%f\r\n",a.data_conver);
system("pause");
return 0;
}
结果:
以上三种方法都能实现字节和float数据的转换
热门推荐
上海四季旅游攻略:避开人潮,享受美景
春天去上海,赏花踏青正当时!
陕北暴雨预警:泥石流风险大揭秘
广州市消委会发布最新洗衣液测评:汰渍、立白等品牌表现优异
洗衣粉vs洗衣液:哪个更护手?
电脑显示无法连接到这个网络怎么办 5种原因分析及解决方法
朱元璋定下的初二回娘家习俗,你了解多少?
南雄珠玑巷:寻根之旅的热门打卡地
南雄市珠玑巷:千年古巷的历史建筑探秘
美尼尔综合症饮食指南:五类食物助力缓解症状
美尼尔氏综合症症状
大科学装置建设迎来重大进展,松山湖科学城发展全面提速
春节必打卡:盛京老北市city walk攻略
沈阳故宫:清朝历史探秘之旅
周末自制麻辣香锅,重庆缙云山的味道在家也能享!
重庆麻辣香锅的家常做法分享
秋冬暖心!健康版麻辣香锅怎么做?
金号毛巾清洁小妙招,你get了吗?
洗衣机桶风干功能:守护家庭健康的秘密武器
桶内微波干燥技术:从工业废物到医疗废物处理的创新应用
秋冬必打卡!上海老字号美食榜单
上海外滩:电影质感随手拍!
外滩+东方明珠:上海必打卡双雄
上海老城厢:700年繁华背后的文化密码
双十一打卡上海外滩和南京路步行街
警惕5个肝脏“红灯”信号!做对这一件事,肝脏更健康
福州仓山区的隐藏瑰宝:首山村
烟台山公园:仓山必打卡文艺地标
沪指3200点保卫战:市场信心大考
地震来袭!飞机上如何自救?