此文章是在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位
}
}