Я некоторое время работаю с rtf-блоком в моем winforms-приложении, запущенном как интерфейс связи между моим внешним аппаратным устройством и моим компьютером через последовательный порт. Проблема заключается в том, что при использовании любого примера изменения цвета для выбора текста (который отправляется до моей фактической команды по последовательному), эхо от моего внешнего устройства также имеет некоторый цвет текста.
отправка символа ';' Я получаю эхо назад и ответ от моего устройства окрашен в текст.
;;[UART+ERROR]
Я получаю обработчик событий:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
//fking threading
string rxString = serialPort1.ReadExisting(); // running on worker thread
this.Invoke((MethodInvoker)delegate
{
textLog.AppendText(rxString); // runs on UI thread
});
}
Чтобы написать на экран, я использовал приведенный ниже пример (среди многих других, которых я также попробовал), чтобы работать в моем приложении. Я не уверен, что я делаю неправильно.
private void AppendTextColor(RichTextBox box, Color color, string text)
{
int start = box.TextLength;
box.AppendText(text);
int end = box.TextLength;
// Textbox may transform chars, so (end-start) != text.Length
box.Select(start, end - start);
{
box.SelectionColor = color;
// could set box.SelectionBackColor, box.SelectionFont too.
}
box.SelectionLength = 0; // clear
}
Вызов Select() оставляет свойство SelectionStart в начале добавленного текста, а не в конце текста. Вы можете восстановить его, как вы делали для SelectionLength, но более простой способ сделать это:
private static void AppendTextColor(RichTextBox box, Color color, string text) {
box.SelectionStart = box.Text.Length; // Optional
var oldcolor = box.SelectionColor;
box.SelectionColor = color;
box.AppendText(text);
box.SelectionColor = oldcolor;
}
Обратите внимание на//Необязательный комментарий, он не нужен, когда пользователь не может редактировать текст.
Остерегайтесь, что у вас очень серьезная проблема с пожарным шлангом в вашем коде. Вы вызываете Invoke() с очень высокой скоростью, что может привести к тому, что поток пользовательского интерфейса начнет записывать 100% -ное ядро, когда коробка начнет заполняться. Легко сказать, когда это произойдет, вы больше не видите обновлений, и ваша программа перестает отвечать на ввод. Буферизация в обработчике событий DataReceived требуется, используя ReadLine() вместо ReadExisting(), как правило, простой способ добраться туда. И вместо этого используйте BeginInvoke(), Invoke(), скорее всего, вызовет вызов SerialPort.Close() в тупик.
Вам необходимо сбросить цвет в обычный цвет текста RTB:
box.SelectionStart = box.Text.Length; // clear..
box.SelectionLength = 0; // clear // ..selection
box.SelectionColor = box.ForeColor; // reset color