串口数据接收速度快于处理速度

本文关键字:处理速度 速度快 数据 串口 | 更新日期: 2023-09-27 18:18:52

我有一个波特率为115200的串行端口从arduino到我的c# Winform。我有一个数据接收事件,它调用一个新线程将传入的数据添加到数据表中。数据表被绑定到一个datagridview。我注意到的问题是,串行端口接收数据和使用新数据更新datagridview之间的延迟越来越大。我已经用串行监视器测试了传入的数据,没有延迟,所以问题是在我的c#代码中的某个地方。下面代码中latest按钮的目的是只保留最新的传入消息ID,并从datagridview中删除具有相同ID的旧消息。这是我的第一个c#项目,我以前从未使用过串行端口。

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    try
    {
        this.BeginInvoke(new EventHandler(DoUpdate));
    }
    catch (System.TimeoutException)
    {
    }
}
private void DoUpdate(object s, EventArgs e)
{
    string inData = serialPort1.ReadLine();
    if (dtFromGrid == null)
    {
        dtFromGrid = new DataTable();
        dtFromGrid.Columns.Add("Time", typeof(String));
        dtFromGrid.Columns.Add("ID", typeof(String));
        dtFromGrid.Columns.Add("Name", typeof(String));
        dtFromGrid.Columns.Add("Data", typeof(String));
    }
    DataRow dr = dtFromGrid.NewRow();
    TimeSpan ts = stopWatch.Elapsed;
    dr["Time"] = String.Format("{0:00}:{1:00}:{2:00}.{3:000}",
    ts.Hours, ts.Minutes, ts.Seconds,
    ts.Milliseconds);
    dr["ID"] = inData.Split(new char[] { '<', ',' })[1];
    dr["Name"] = inData.Split(new char[] { ',', '/' })[1];
    dr["Data"] = inData.Split(new char[] { '/', '>' })[1];
    dtFromGrid.Rows.InsertAt(dr, 0);
    if (NewestButton.Text == "Chronological")
    {
        for (int i = 1; i < dataGridView1.Rows.Count; i++)
        {
            if (dtFromGrid.Rows[i].ItemArray[1].ToString() == dtFromGrid.Rows[0].ItemArray[1].ToString())
            {
                dtFromGrid.Rows[i].Delete();
                break;
            }
        }
    }
    if (dtFromGrid.Rows.Count == 51)
    {
        dtFromGrid.Rows[50].Delete();
    }
    dtFromGrid.AcceptChanges();
    dataGridView1.DataSource = dtFromGrid;
    dataGridView1.CurrentCell = dataGridView1.Rows[0].Cells[0];
    if (logFile != "")
    {
        using (StreamWriter sw = File.AppendText(logFile))
        {
            DataRow row = dtFromGrid.Rows[0];
            object[] array = row.ItemArray;
            int col = 0;
            for (col = 0; col < array.Length - 1; col++)
            {
                sw.Write(array[col].ToString() + "'t|'t");
            }
            sw.Write(array[col].ToString());
            sw.WriteLine();
            sw.Close();
        }
    }
}

串口数据接收速度快于处理速度

我认为最简单的方法是在Arduino和c#/之间建立串行连接。. NET程序是使用CmdMessenger库。用法非常简单,网上有一些示例和文档资源。

CmdMessenger在线程中使用命令队列和处理策略,因此您应该没有性能问题。