将人们在 C# 中的 DataTable 中输入的值发送到微控制器

问题描述

我试图将人们从 DataTable 输入的值发送到微控制器,但是当我通过 teraTerm 再次检查微控制器中的值时,我得到的结果是错误的。

图片

enter image description here

这是我的网格初始化代码

private void Form1_Load(object sender,EventArgs e)
{
    //Data table
    DataTable table = new DataTable();

    //Column
    table.Columns.Add("TPS");
    table.Columns.Add("500",typeof(float));
    table.Columns.Add("750",typeof(float));
    //Row
    table.Rows.Add("100%");
    table.Rows.Add("95%");
    table.Rows.Add("90%");

    //Data Grid View
    dtgridview.DataSource = table;

    //Set width
    dtgridview.Columns[0].Width = 40;
    dtgridview.Columns[1].Width = 40;
    dtgridview.Columns[2].Width = 40;

}

发送:

private void btnSend_Click(object sender,EventArgs e)
{
    try
    {
        for (int i = 0; i < dtgridview.Rows.Count; i++)
            for (int j = 0; j < dtgridview.Columns.Count; j++)
            {
                object o = dtgridview.Rows[i].Cells[j].Value;

                if (P.IsOpen == true)
                {
                    P.WriteLine(o.ToString());
                    MessageBox.Show("Write succesfully!");
                    P.Close();
                }
            }
    }
    catch(Exception ex)
    {
        MessageBox.Show("Unable to write to COM port");
    }
}

解决方法

当你运行这个循环时:

for (int i = 0; i < dtGridView.Rows.Count; i++)
    for (int j = 0; j < dtGridView.Columns.Count; j++)
    {
        object o = dtGridView.Rows[i].Cells[j].Value;
        if (P.IsOpen == true)
        {
            P.WriteLine(o.ToString());
            MessageBox.Show("Write succesfully!");
            P.Close(); // <<<<<<<<<<<<<<<<<<< this close the connection immediately after 1st val.
        }
    }

而是尝试在循环后关闭它。

for (int i = 0; i < dtGridView.Rows.Count; i++)
    for (int j = 0; j < dtGridView.Columns.Count; j++)
    {
        object o = dtGridView.Rows[i].Cells[j].Value;
        if (P.IsOpen == true)
        {
            P.WriteLine(o.ToString());
            MessageBox.Show("Write succesfully!");
        }
    }

if (P.IsOpen == true)
   P.Close();             // like this
,

正如其他人所指出的,如果您在第一次迭代后调用 P.Close() 的问题。通常在连接后进行串行通信时,我只会保持连接打开,直到用户明确断开连接。我建议从循环中删除 P.Close();,而是添加一个调用 P.Close(); 的断开连接按钮。

这应该会简化您的代码,并且发送按钮将只关注写入数据而不管理串行通信的状态。

,

谢谢大家,我成功发送了价值。但是如果我按照我的方式做,它会发送表的每个值。现在我想点击发送按钮,我输入的所有值都会一次性发送。无论如何都要这样做吗?

附上图片:enter image description here