将U16类型转换成u32,float,u8字符串

此文章是在modbus数据格式转换上所做的修改,不仅可以用于保持寄存器,也可以用于其他自定义的u16类型的数组

common.h 头文件
#ifndef __COMMON_H
#define __COMMON_H
#include "sys.h"

/*浮点数与IEEE754格式转换*/
typedef union                                        
{
   float f_Buf;  //小数
   u8  uc_Buf[4];  //u8,用于存放IEEE754类型的小数
   u16 us_Buf[2];  //u16,用于将IEEE754类型的小数存放到保持寄存器中
   u32 u_Buf;
}float_DtformConver; 

void vUint16ConvertFloat(u16 *usData,float *fData);// 2个u16类型的数合成一个float
void vFloatConvertUint16(u16 *usRdata,float fData);//一个float变成2个Uint16
void vUint16ConvertUint32(u16 *usWdata,u32 *uData);//2个u16类型的数合成一个U32
void vUint32ConvertUint16(u16 *usRdata,u32 uData);//一个U32变成2个Uint16
void vUint16ConvertString(u16 *usWdata,u8 *Rstr,u16 uNBytes);//将u16类型的数据内容放入字符串中
void vStringConvertUint16(u16 *usRdata,u8 *Wstr,u16 uNBytes);//将字符串放入u16类型的数组中
#endif
common.c 文件
#include "common.h"
/**
* @file   vUint16ConvertFloat
* @brief  2个u16类型的数合成一个float
* @param usWdata u16数据首地址  fData 小数接收指针
* @retval
* @date  2021/8/13
*/
void vUint16ConvertFloat(u16 *usWdata,float *fData)
{
	float_DtformConver unTemp;
	/*第一种方式*/
//	unTemp.uc_Buf[0] = (u8 )(usData[0]&0xff);
//	unTemp.uc_Buf[1] = (u8 )(usData[0]>>8);	
//	unTemp.uc_Buf[2] = (u8 )(usData[1]&0xff);
//	unTemp.uc_Buf[3]= (u8 ) (usData[1]>>8);
	/*第二种方式*/
	unTemp.us_Buf[0] = usWdata[0];//低16位
	unTemp.us_Buf[1] = usWdata[1];//高16位
	*fData = unTemp.f_Buf;//获取小数值
}


/**
* @file   vFloatConvertUint16
* @brief  一个float变成2个Uint16
* @param  usRdata u16数据首地址  fData 小数值
* @retval
* @date  2021/8/13
*/

void vFloatConvertUint16(u16 *usRdata,float fData)
{
	float_DtformConver unTemp;
	unTemp.f_Buf = fData;
	
	/*第一种方式*/
//	usData[0] = unTemp.uc_Buf[0];
//	usData[0] |= (u16)unTemp.uc_Buf[1] <<8;
//	usData[1] = unTemp.uc_Buf[2];
//	usData[1] |= (u16)unTemp.uc_Buf[3] <<8;
	
	/*第二种方式*/
	usRdata[0] = unTemp.us_Buf[0];
	usRdata[1] = unTemp.us_Buf[1];
	
}



/**
* @file   vUint16ConvertFloat
* @brief  2个u16类型的数合成一个U32
* @param  usData u16数据首地址  ulData接收指针
* @retval
* @date  2021/8/13
*/
void vUint16ConvertUint32(u16 *usWdata,u32 *uData)
{
	float_DtformConver unTemp;
	/*第一种方式*/
//	unTemp.uc_Buf[0] = (u8 )(usData[0]&0xff);
//	unTemp.uc_Buf[1] = (u8 )(usData[0]>>8);	
//	unTemp.uc_Buf[2] = (u8 )(usData[1]&0xff);
//	unTemp.uc_Buf[3]= (u8 ) (usData[1]>>8);
	/*第二种方式*/
	unTemp.us_Buf[0] = usWdata[0];//低16位
	unTemp.us_Buf[1] = usWdata[1];//高16位
	*uData = unTemp. u_Buf;//获取u32值
}


/**
* @file  vUint32ConvertUint16
* @brief  一个U32变成2个Uint16
* @param usRdata 接收数据首地址 uData 整数值
* @retval
* @date  2021/8/13
*/

void vUint32ConvertUint16(u16 *usRdata,u32 uData)
{
	float_DtformConver unTemp;
	unTemp.u_Buf = uData;
	usRdata[0] = unTemp.us_Buf[0];
	usRdata[1] = unTemp.us_Buf[1];
}





/**
* @file   vUint16ConvertString
* @brief  将u16类型的数据内容放入字符串中
* @param  usWdata u16写入数组 Rstr 以u8来接收字符串的数组  usNBytes 字节数
* @retval 
* @data   2021/8/13
*/
void vUint16ConvertString(u16 *usWdata,u8 *Rstr,u16 usNBytes)
{
	u8 i ,j;
	i =j =0;
	while(i <  usNBytes)
	{
		if((i%2)==0 )//如果没有余数,则表示是在低8位
			Rstr[i++]= (u8)(usWdata[j] &0xff);//得到低8位
		else
			Rstr[i++] = (u8)(usWdata[j++]>> 8);//得到高8位
	}
	
}
/**
* @file   vStringConvertUint16
* @brief  将字符串放入u16类型的数组中
* @param  usRdata u16接收数组 Wstr 要写入的字符串数据   usNBytes 字节数
* @retval 
* @data   2021/8/13
*/
void vStringConvertUint16(u16 *usRdata,u8 *Wstr,u16  usNBytes )
{
	
	u16 i,j;
	i = j =0;
	while(i <  usNBytes)
	{
		if((i%2) == 0) 
			usRdata[j] = Wstr[i++];//第一个字符放入,低8位
		else 
			usRdata[j++]  |= (u16)Wstr[i++]<<8;第二个字符放入,高8位
	}
}

  • 0
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值