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