如何在c#中将浮点数转换为二进制
本文关键字:浮点数 转换 二进制 | 更新日期: 2023-09-27 18:18:10
我有两个浮动f1
&f2
。我需要将它们转换成二进制(例如:01010101 10000001 11110000 01011110,即8位*4),然后通过串口发送。在接收端,接收到这些二进制信号后,我需要将其转换为浮点数,并将其显示为字符串。
我的问题是:
-
我的转换从浮点到二进制正确吗?
-
接收到信号时,
textbox3
只显示一些随机码,textbox4
为空。为什么会这样?
我现在的代码如下:
发送:
byte[] b1 = System.BitConverter.GetBytes(f1), b2 = System.BitConverter.GetBytes(f2);
if (serialPort.IsOpen)
{
serialPort.Write(b1, 0, 4);
serialPort.Write(b2, 0, 4);
}
收到:
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
byte[] b = new byte[sp.BytesToRead];
sp.Read(b, 0, sp.BytesToRead);
Invoke(new Action(() => textBox3.AppendText(Encoding.UTF8.GetString(b))));
float newf = System.BitConverter.ToSingle(b, 0);
textBox4.Text = newf.ToString();
}
几个错误,您希望您将收到发送的整个'包'。串行端口不这样工作。您必须等到接收到所有8个字节。Encoding.UTF8
是非常不合适的,它不是文本。像这样写:
private byte[] Buffer = new byte[8];
private int Rcved = 0;
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
Rcved += sp.Read(Buffer, Rcved, 8 - Rcved);
if (Rcved < 8) return;
float f1 = BitConverter.ToSingle(Buffer, 0);
float f2 = BitConverter.ToSingle(Buffer, 4);
string txt3 = BitConverter.ToString(Buffer);
string txt4 = String.Format("{0}, {1}", f1, f2);
this.BeginInvoke(new Action(() => {
textBox3.AppendText(txt3 + Environment.NewLine);
textBox4.Text = txt4;
}));
Rcved = 0;
}
注意同步问题,当设备忙于发送时,程序不能正常启动,它只有1/8的机会开始读取正确的字节。解决这个问题需要一个协议,一个非常简单的协议是主从协议,其中设备在明确要求之前不会发送任何东西。
注意消防水管问题,你的UI可能冻结在BeginInvoke()调用,如果他们发生得太频繁。在这种情况下,你需要改进UI,没有人会喜欢看着一串数字飞得比他可能阅读的速度还快。