即是所谓的IEEE754标准,这也是大多数硬件存储浮点数的标准。单精度浮点数占4个字节,表示范围为:在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38 。
在C#中的转换函数为:
1,由四个字节的十六机制数组转浮点数:
byte[] bytes = new byte[4];
BitConverter.ToSingle(bytes, 0);
2,由浮点数转数组:
byte[] bytes = BitConverter.GetBytes(floatValue);
这种转换方法经常用于串口通讯中,表示范围足够各种传感器数值传输及工控场合,将要发送的浮点数据转换为4个字节的十六机制数,然后由串口发出,在接收端再将其转换为浮点数。
单片机或非环境下使用转换程序则不能调用BitConverter类!
提供以下代码以供转换:
未修改过的如下:可以在C#中直接调用而不用库函数
public static float ToFloat(byte[] data)
{
float a = 0;
byte i;
byte[] x = data;
unsafe
{
void* pf;
fixed (byte* px = x)
{
pf = &a;
for (i = 0; i < data.Length; i++)
{
*((byte*)pf + i) = *(px + i);
}
}
}
return a;
}
public static byte[] ToByte(float data)
{
unsafe
{
byte* pdata = (byte*)&data;
byte[] byteArray = new byte[sizeof(float)];
for (int i = 0; i < sizeof(float); ++i)
byteArray[i] = *pdata++;
return byteArray;
}
}
如果对工程进行直接编译会报出一下错误:这是因为C#默认不提供指针支持,只有在不安全代码的形式下才可以用指针。
错误 1 不安全代码只会在使用 /unsafe 编译的情况下出现 E:\Visual Studio 2008\Projects\TEST\testOfFloatConsolt\testOfFloatConsolt\Program.cs 26 13 testOfFloatConsolt |
这时选择VS的菜单栏中的项目->"Project"属性->生成->常规->允许不安全代码 勾选即可
单片机串口通讯浮点转换函数
我在AVR串口通信协议中用到了这部分,直接将单片机的运算结果(浮点类型)转换为(字节类型)嵌入串口通信协议中,上传至上位机。
下面为符合IEEE754标准将浮点数转换为四个字节的数组的函数源代码:已经用于mega16单片机的串口通信中。
WinAVR-20090313测试通过:
voidFloatToByte(float floatNum,unsigned char* byteArry)
{
char* pchar=(char*)&floatNum;
for(int i=0;i<sizeof(float);i++)
{
*byteArry=*pchar;
pchar++;
byteArry++;
}
}
下面为符合IEEE754标准的由四个字节型数组转化为相应的浮点数
WinAVR-20090313测试通过:
floatByteToFloat(unsigned char* byteArry)
{
return*((float*)byteArry);
}
调用测试方法:其中USART_Transmit();为向串口发送的函数。
unsigned char floatToByte[4];
FloatToByte(12.15,floatToByte);
floata=ByteToFloat(floatToByte);
FloatToByte(a,floatToByte);
USART_Transmit(floatToByte[0]);
float数值范围USART_Transmit(floatToByte[1]);
USART_Transmit(floatToByte[2]);
USART_Transmit(floatToByte[3]);
在上位机用串口进行读取时调用
BitConverter.ToSingle(bytes, 0);
就会转换成12.15,测试方法可以随着需求改变。
blog.sina/s/blog_4b94ff130100ejyb.html
下面用共用体变量写;
union data
{ float f;
uchar l[4];
} m;
字节就是m.l[0],m.l[1],m.l[2],m.l[3].
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论