如何在c#中将float转换为二进制?

时间:2014-08-16 09:41:16

标签: c# serialization serial-port

我有2个花车f1& f2。我需要将它们转换为二进制(例如01010101 10000001 11110000 01011110,即8位* 4)然后通过串口发送它们。在接收端,在接收到二进制信号后,我需要将它们转换为float并将它们显示为字符串。

我的问题是:

  1. 我从float转换为二进制是否正确?

  2. 收到信号后,textbox3仅在textbox4为空时显示一些随机代码。这是为什么?

  3. 我目前的代码如下。

    发送:

    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();
         }
    

1 个答案:

答案 0 :(得分:3)

有几个错误,您希望您将获得整个''那是发送的。串行端口不起作用。您必须等到收到所有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;
}

请注意同步问题,当设备忙于发送时,您的程序无法正常启动,只有八分之一的机会以正确的字节开始读取。解决这个问题需要一个协议,一个非常简单的协议是主从设备,设备在明确要求之前不发送任何内容。

并且要注意防火管问题,如果它们过于频繁地发生,您的UI可能会冻结BeginInvoke()调用。在这种情况下,你需要改进用户界面,没有人会喜欢以比他可能阅读的更快的速度查看飞行数字列表。