У меня есть код, который я написал, и он делает то, что я хочу. Однако я не совсем уверен, как именно это работает. Часть, с которой у меня больше всего проблем, - это последняя часть. У меня был textBox1.Text = "test", который не работал. У меня возникла ошибка времени выполнения из-за того, что он был вызван из другого потока. Когда я поместил textBox1.Invoke (и т. Д.), Он работал, как ожидалось. Почему?
Как видите, я знаю достаточно, чтобы быть опасным, и я действительно хочу понять, что здесь происходит, вместо того, чтобы слепо копировать и вставлять данные с сайтов в Интернете.
У меня в классе SerialCommunicator есть следующее:
public SerialCommunicator(SerialPort sp)
{
this.sp = sp;
sp.ReceivedBytesThreshold = packetSize;
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
sp.Open();
}
public void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(50);
SerialPort s = (SerialPort)sender;
byte[] buffer = new byte[128];
s.Read(buffer, 0, s.BytesToRead);
}
Затем в моем Form1.cs у меня есть кнопка, которая при нажатии выполняет следующие действия:
private void btnPortOK_Click(object sender, EventArgs e)
{
string comPort = cboComPorts.SelectedItem.ToString();
SerialPort sp = new SerialPort(comPort, 9600, Parity.None, 8, StopBits.One);
sp.DataReceived += new SerialDataReceivedEventHandler(DataHasBeenReceived);
comm = new SerialCommunicator(sp);
}
public void DataHasBeenReceived(object sender, EventArgs args)
{
textBox1.Invoke(new EventHandler(delegate { textBox1.Text += "test"; }));
}