serialPort1.Write(CMD) записывает предыдущую строку в textBox. в C#
У меня действительно странная проблема. Вот краткое объяснение того, что я пытаюсь. Я пишу графический интерфейс для управления PIC MCU, который подключен к двум двигателям.
У меня есть несколько кнопок на форме, и одна из них - кнопка сброса двигателя. В дополнение к этому, у меня также есть текстовое поле, в котором будет отображаться журнал предыдущих действий. Например, к предыдущему действию добавлена строка "Открытие порта Com4... ВЫПОЛНЕНО" в текстовом поле. Если я отправляю Reset Motor Code с использованием serialPort1.Write(CMD), программа не будет ждать, пока не получит ответ от MCU, и поместит последнюю строку в конце новой строки. так что в этом случае, если последней строкой было ВЫПОЛНЕНО, программа поместит это в конец новой строки без того, чтобы я что-либо записывал в текстовое поле.
Я надеюсь, что это имеет смысл, и надеюсь, что вы, ребята, можете мне помочь, потому что это сводит меня с ума. веселит,
private void connectUWGP_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(comboBox1.Text))
{
textBox1.AppendText("Please select a COM Port." + Environment.NewLine);
return;
}
else
{
if(Con_DisCon)
{
random_no = random.Next(0, 9);
Serial_Init();
textBox1.AppendText("Identifying Device on " + comboBox1.Text + "...");
if(Serial_Send_CMD("(" + random_no.ToString() + ",7,x,x,x)")) //Send IDENTIFY Command
{
}else
{
textBox1.AppendText("Failed" + Environment.NewLine);
}
}else
{
textBox1.AppendText("Stopping UWGP...");
if(Serial_Send_CMD("(" + tb_UWGP_ID_NO.Text + ",6,x,x,x)")) //Send STOP Command
{
} else
{
textBox1.AppendText("Failed" + Environment.NewLine);
}
}
}
}
private bool Serial_Send_CMD(string CMD)
{
try
{
if (serialPort1.BytesToRead != 0) serialPort1.DiscardInBuffer();
serialPort1.WriteLine(CMD);
serialPort1.DiscardOutBuffer();
return true;
}
catch
{
serialPort1.DiscardOutBuffer();
return false;
}
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)//Function that handles Serial port receive events
{
if (e.EventType == System.IO.Ports.SerialData.Eof)
{
return;
}
Thread.Sleep(100);
int i = 0;
while(serialPort1.BytesToRead!=0 && serialPort1.IsOpen)
{
try
{
RX_DATA[i] = (char)serialPort1.ReadChar();
Thread.Sleep(2);
}
catch(Exception)
{
}
i++;
}
serialPort1.DiscardInBuffer();
Data_Read_DONE = true;
this.BeginInvoke(new EventHandler(Check_RX_DATA));//.Invoke(new EventHandler(Check_RX_DATA));
}
private void Check_RX_DATA(object sender, EventArgs e)
{
Thread.Sleep(100);
if (RX_DATA[1].ToString() == random_no.ToString())
{
if ((RX_DATA[3] == '0'))
{
if(RX_DATA[5] == '1')
{
textBox1.AppendText("Done" + Environment.NewLine);
}else if(RX_DATA[7] == '1')
{
textBox1.AppendText("LightBox Reset" + Environment.NewLine);
}
//for(int i = 0; i< 16; i++)
//{
// RX_DATA[i] = '\0';
//}
}
else if (RX_DATA[3] == '1')
{
//textBox1.AppendText("Done" + Environment.NewLine);
}
else if (RX_DATA[3] == '2')
{
//textBox1.AppendText("Done" + Environment.NewLine);
}
else if (RX_DATA[3] == '3')
{
//textBox1.AppendText("Done" + Environment.NewLine);
}
else if (RX_DATA[3] == '4')
{
//textBox1.AppendText("Done" + Environment.NewLine);
}
else if (RX_DATA[3] == '5')
{
// textBox1.AppendText("Done" + Environment.NewLine);
}
else if (RX_DATA[3] == '6')
{
textBox1.AppendText("Done" + Environment.NewLine);
if(serialPort1.IsOpen)
{
textBox1.AppendText("Closing ComPort...");
try
{
serialPort1.Close();
}
catch (IOException)
{
textBox1.AppendText("Failed" + Environment.NewLine);
return;
}
}
connectUWGP.Text = "Connect";
tb_UWFP_FW.Clear();
tb_UWGP_ID_NO.Clear();
Automate_Scan_grp.Enabled = false;
fullScan.Enabled = false;
halfScan.Enabled = false;
Man_Scan_grp.Enabled = false;
resetPosition.Enabled = false;
Con_DisCon = true;
textBox1.AppendText("Done" + Environment.NewLine);
}
else if (RX_DATA[3] == '7')
{
string str_firmware = "";
float flt_firmware = 0;
tb_UWGP_ID_NO.Text = RX_DATA[1].ToString();
str_firmware = RX_DATA[5].ToString() + RX_DATA[6].ToString() + RX_DATA[7].ToString();
int x = Convert.ToInt32(str_firmware);
flt_firmware = (float)x / 1000;
tb_UWFP_FW.Text = flt_firmware.ToString();
connectUWGP.Text = "Disconnect";
Automate_Scan_grp.Enabled = true;
fullScan.Enabled = true;
halfScan.Enabled = true;
Man_Scan_grp.Enabled = true;
resetPosition.Enabled = true;
Con_DisCon = false;
textBox1.AppendText("Done" + Environment.NewLine);
}
else
{
textBox1.AppendText("Failed - Response ID or Response Mode does not match" + Environment.NewLine);
return;
}
}
}
Labmat.