问题描述
我试图将人们从 DataTable 输入的值发送到微控制器,但是当我通过 teraTerm 再次检查微控制器中的值时,我得到的结果是错误的。
图片:
这是我的网格初始化代码:
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();
的断开连接按钮。
这应该会简化您的代码,并且发送按钮将只关注写入数据而不管理串行通信的状态。
,谢谢大家,我成功发送了价值。但是如果我按照我的方式做,它会发送表的每个值。现在我想点击发送按钮,我输入的所有值都会一次性发送。无论如何都要这样做吗?