如何在c#中将浮点数转换为二进制

本文关键字:浮点数 转换 二进制 | 更新日期: 2023-09-27 18:18:10

我有两个浮动f1 &f2。我需要将它们转换成二进制(例如:01010101 10000001 11110000 01011110,即8位*4),然后通过串口发送。在接收端,接收到这些二进制信号后,我需要将其转换为浮点数,并将其显示为字符串。

我的问题是:

  1. 我的转换从浮点到二进制正确吗?

  2. 接收到信号时,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();
     }

如何在c#中将浮点数转换为二进制

几个错误,您希望您将收到发送的整个'包'。串行端口不这样工作。您必须等到接收到所有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,没有人会喜欢看着一串数字飞得比他可能阅读的速度还快。