Как использовать SerialPort в .Net с помощью события DataReceived? - PullRequest
3 голосов
/ 23 апреля 2010

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

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

В этом коде предполагается, что вы уже добавили объект 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;
}
1 голос
/ 23 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...