C# 如何在c中将浮点转换成二进制?

C# 如何在c中将浮点转换成二进制?,c#,serialization,serial-port,C#,Serialization,Serial Port,我有两个浮动f1和f2。我需要把它们转换成二进制文件。01010101 1000001 11110000 01011110,即8位*4,然后通过串行端口发送。在接收端,在以二进制形式接收这些信号之后,我需要将它们转换为float并将它们显示为字符串 我的问题是: 从浮点到二进制的转换正确吗 当接收到信号时,textbox3仅显示一些随机代码,而textbox4为空。为什么会这样 我目前的代码如下 发送: 接收: 如果有几个错误,您希望收到发送的整个“包”。串行端口不是那样工作的。您必须等到收到全

我有两个浮动f1和f2。我需要把它们转换成二进制文件。01010101 1000001 11110000 01011110,即8位*4,然后通过串行端口发送。在接收端,在以二进制形式接收这些信号之后,我需要将它们转换为float并将它们显示为字符串

我的问题是:

从浮点到二进制的转换正确吗

当接收到信号时,textbox3仅显示一些随机代码,而textbox4为空。为什么会这样

我目前的代码如下

发送: 接收: 如果有几个错误,您希望收到发送的整个“包”。串行端口不是那样工作的。您必须等到收到全部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;
}
请注意同步问题,当设备忙于发送时,您的程序无法正常启动,它只有八分之一的机会开始读取正确的字节。解决这个问题需要一个协议,一个非常简单的协议是主从协议,设备在被明确要求发送之前不会发送任何东西


还要注意消防水管的问题,如果BeginInvoke呼叫太频繁,您的用户界面可能会冻结。在这种情况下,你需要改进用户界面,没有人会喜欢看一个数字列表,它的速度超过了你的阅读速度。

祝你好运,但你的问题是什么?嗨,谢谢你的回复!我想将浮点转换成二进制,然后通过串口发送,接收后,将二进制转换回浮点,然后显示为字符串。我不确定我把浮点转换成二进制的方法是否正确。问题2。当接收到信号时,textbox3只显示一些随机代码,textbox4为空。请将此评论放在问题中。您好,非常感谢您的帮助!我现在正试图吸收你的评论。顺便说一句,我如何发送命令?我把浮点转换成二进制的方法正确吗?我对此很困惑,因为MSDN显示bitconverter.getbyte要转换为十六进制,而不是二进制。但我找不到其他方法将浮点转换成二进制,就像01010101 1000001 11110000 01011110格式。谢谢!字节是二进制的。如果要打印0和1,则必须为此编写代码。非常小的一点,它将很快让人厌烦流泪。嗨,我得到了代码!非常感谢你!最后一个问题,在收到信号后,只会显示最新的信号,因为当我发送多个信号时,我无法从文本框查看所有信号。我该怎么修?循环?
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();
     }
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;
}