0

我遇到了让我发疯的问题——我认为这很容易,以至于我什至无法思考是什么导致了我的问题。

我正在通过串行端口将我的 uC 生成的数据(生成的声波的 fft - 频率和幅度)发送到 PC。

在我尝试使用 MS Chart Controls 绘制数据之前,一切似乎都运行良好 - 如果不绘制图表,则接收数据时不会出现错误。我总是能够绘制一次或两次数据图表,之后我收到如下错误:

System.Windows.Forms.DataVisualization.dll 中出现“System.OverflowException”类型的未处理异常

附加信息:对于 Decimal,值太大或太小。

我检查了数据的值是否超过了“float32”又名 Single 的限制——我什至应用了声明,当它们太高时我将值降低——这是没用的。我的带有recievedata 事件和图表的部分是这样的:

private byte[] bArray = new byte[20 * numberOfSamples + 4]; // frequencies (512 samples) and magnitudes (512 values) - each is a single precision float so 4 bytes + 4 - "!!!!" at the beginning
private float[] fArray = new float[2 * numberOfSamples + 1]; // float data array


        private void SerialP_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;


        int previouse = counterOfRecBytes;

        counterOfRecBytes += sp.BytesToRead;
        //if (counterOfRecBytes >= 4104) 

        sp.Read(bArray, previouse, (counterOfRecBytes - previouse));

        if (counterOfRecBytes >= 8 * numberOfSamples + 4)
        {
            for (uint i = 0; i < 2 * numberOfSamples + 1; i++)
            {
                fArray[i] = Math.Abs(ByteToFloat(bArray, i));
                if (fArray[i] < 0) fArray[i] = 0;
                if (fArray[i] > 3.4 * Math.Pow(10, 38) || fArray[i] < -3.4 * Math.Pow(10, 38)) fArray[i] = 0;
            }

            if (InvokeRequired)
            {
                Invoke(new MethodInvoker(ChartData));
            }
            else
            {
                ChartData();
            }

            // Set counterOfRecBytes to recieve new data
            counterOfRecBytes = 0;
        }



    }

    ///// <summary>
    ///// Changes my recieved bArray to single precision floats
    ///// </summary>
    private float ByteToFloat(byte[] input, UInt32 i)
    {
        byte[] array = new[] { input[4 * i], input[4 * i + 1], input[4 * i + 2], input[4 * i + 3] };
        return BitConverter.ToSingle(array, 0);
    }

    /// <summary>
    /// Setting chart data
    /// </summary>
    private void ChartData()
    {

        chart1.Series["Widmo"].Points.Clear();

        for(int i = 1; i < numberOfSamples + 1; i++)
        {
            chart1.Series["Widmo"].Points.AddXY(fArray[i], fArray[i + numberOfSamples]);
        }

    }
4

0 回答 0