Я разработчик программного обеспечения для встраиваемых систем для критически важных для безопасности систем, поэтому я довольно новичок в C #, но хорошо знаю языки на основе C.
Чтобы немного рассказать об этом, я разработал форму Windows, которая интерпретируетпакеты последовательных данных, отправленные из моего встроенного программного обеспечения через последовательный порт в значимую информацию отладки.
Что я хочу сделать, это отобразить каждый байт каждого пакета в элементе управления TextBox.Элемент управления textbox, который отображает информацию о пакете, фактически является второй формой, открытой первой формой.Вот код для обработчика событий, который открывает вторую форму из первой:
private void ShowRawSerialData(object sender, EventArgs e)
{
SendSerialDataToForm = true;
if (SerialStreamDataForm == null)
SerialStreamDataForm = new RawSerialDataForm();
SerialStreamDataForm.Instance.Show();
}
В приведенном выше коде директива .Instance.Show () является средством, с помощью которого я могу открыть новую форму, еслиформа закрыта, но не показывает новую форму, если форма уже открыта.Затем в обработчике событий, полученных с помощью последовательных данных, я делаю это:
// Get bytes from the serial stream
bytesToRead = IFDSerialPort.BytesToRead;
MsgByteArray = new Byte[bytesToRead];
bytesRead = IFDSerialPort.Read(MsgByteArray, 0, bytesToRead);
// Now MsgByteArray has the bytes read from the serial stream,
// send to raw serial form
if (SendSerialDataToForm == true && SerialStreamDataForm != null)
{
SerialStreamDataForm.UpdateSerialDataStream(MsgByteArray);
}
Где MsgByteArray - байтовый массив полученного последовательного пакета.А вот код для UpdateSerialDataStream:
public void UpdateSerialDataStream(Byte[] byteArray)
{
String currentByteString = null;
currentByteString = BitConverter.ToString(byteArray);
currentByteString = "0x" + currentByteString.Replace("-", " 0x") + " ";
if (RawSerialStreamTextBox.InvokeRequired)
{
RawSerialStreamTextBox.Invoke(new SerialTextBoxDelegate(this.UpdateSerialDataStream), new object[] { byteArray });
}
else
{
RawSerialStreamTextBox.Text += currentByteString;
}
RawSerialStreamTextBox.Update();
}
Конечный результат заключается в том, что значение RawSerialStreamTextBox.Text правильно обновляется с помощью строки, которую я намереваюсь добавить в текстовое поле!Например, если я передаю байтовый массив {0x01, 0x7F, 0x7E}, то через отладчик я вижу, что значение RawSerialStreamTextBox.Text = "0x01 0x7F 0x7E".
Проблема заключается в том, чтоэлемент управления текстового поля не показывает вновь добавленный текст.Поэтому, хотя я могу подтвердить с помощью отладчика, что RawSerialStreamTextBox.Text = "0x01 0x7F 0x7E", текстовое поле в Windows не показывает "0x01 0x7F 0x7E", а остается пустым.
Любые идеи относительно того, что может бытьздесь происходит?