Как использовать SerialPort в .Net с помощью события DataReceived?

92
10

Я знаю, что событие DataReceived запускается в фоновом потоке. Как сообщить потоку GUI для отображения данных в обработчике событий?

спросил(а) 2021-01-19T18:18:07+03:00 9 месяцев, 1 неделя назад
1
Решение
66

Этот код предполагает, что вы уже добавили объект SerialPort на уровне формы с помощью метода port_DataReceived, прикрепленного к его событию DataReceived, и что у вас есть метка с именем label1 в вашей форме.


Я не уверен на 100% о коде, который преобразует байты, доступные в порту, в строку, так как я не запускаю это с помощью сбора данных последовательного последовательного порта. Но этот код позволит вам отображать полученные данные независимо от того, находится ли событие в другом потоке или нет.

void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
byte[] buffer = new byte[port.BytesToRead];
port.Read(buffer, 0, buffer.Length);
string data = UnicodeEncoding.ASCII.GetString(buffer);
if (label1.InvokeRequired)
{
Invoke(new EventHandler(DisplayData), data, EventArgs.Empty);
}
else
{
DisplayData(data, EventArgs.Empty);
}
}

private void DisplayData(object sender, EventArgs e)
{
string data = (string)sender;
label1.Text = data;
}

ответил(а) 2021-01-19T18:18:07+03:00 9 месяцев, 1 неделя назад
65

Вы можете использовать методы IsInvokeRequired и BeginInvoke в вашей форме для переключения управления обратно в поток пользовательского интерфейса.

В некоторых случаях я также использовал таймер для наблюдения за изменениями в некоторой общей структуре данных, такой как список сообщений. Но это лучше всего работает, когда у вас есть довольно устойчивый поток сообщений, поступающих из некоторого фонового потока.

ответил(а) 2021-01-19T18:18:07+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема