c#SerialPort - 不读取所有数据发送

时间:2017-01-19 16:52:23

标签: c# serial-port

我最近创建了一个应用程序,它通过UART从我的STM设备接收数据。我尝试发送的数据是一个浮点数组 - 浮点数[512]。 数据以纯二进制形式发送 - 不是字符串。通常想法是4xbyte = float。

我确信我发送的数据很好。使用名为“Terminal”的程序和IEEE 754 Converter进行检查。 My program

在程序中,我从可用参数和其他参数中选择COMport。 (默认情况下,它们是我的COM适配器参数)。我打开连接,然后当STM完成发送数据时,我点击“Odebrane”按钮,这样它将在TextBox中显示数据

问题是我没有收到所有数据。 我不知道是什么原因。

private List<float> lista = new List<float>();
private float[] fDane = new float[1024];

    public Form1()
    {
        InitializeComponent();            
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        getAvailablePorts();
        tb_Rx.Text = "Wprowadź parametry transmisji";
        cb_BaudRate.Text = "9600";
        cb_DataBits.Text = "8";
        cb_Handshake.Text = "None";
        cb_Parity.Text = "None";
        cb_StopBits.Text = "One";
    }


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

        int size = sp.BytesToRead;
        byte[] bArray = new byte[size];
        float[] fArray = new float[size / 4];
        sp.Read(bArray, 0, size);

        for (uint i = 0; i < size / 4; i++)
        {
            fArray[i] = ByteToFloat(bArray, i); // change 4 bytes to  float
            lista.Add(fArray[i]);            
        }

    }

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

    private void bt_transform_Click(object sender, EventArgs e)
    {
        float[] fDane = lista.ToArray();
        for(UInt32 i = 0; i < fDane.Length; i++)
        {
            RxPisz(fDane[i]);

        }
    }

-------------------------已解决--------------------- 更改了dataRecieved中断处理程序

private void SerialP_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            byte[] bArray = new byte[4*numberOfSamples];
            float[] fArray = new float[numberOfSamples];


            int previouse = counterOfRecBytes;

            counterOfRecBytes += sp.BytesToRead;

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



            if (counterOfRecBytes == 4*numberOfSamples)
            {
                for (uint i = 0; i < numberOfSamples; i++)
                {
                    fArray[i] = ByteToFloat(bArray, i); // change 4 bytes to float
                    lista.Add(fArray[i]);
                }
                counterOfRecBytes = 0;
            }
        }

1 个答案:

答案 0 :(得分:0)

我认为你没有以良好的速度读取数据,试图将BaudRate从9600改为19200.