Я использую WPF и архитектуру MVVM.
Мне нужно обновить свое представление и модель данных любыми полученными последовательными данными, которые могут быть в любое время.
Для реализации этого у меня есть
public static partial class SerialPortService
{
private static SerialPort Port = new SerialPort
{
Handshake = Handshake.None,
BaudRate = 9600,
ReadTimeout = 400,
DiscardNull = false,
ReceivedBytesThreshold = 1,
WriteTimeout = 100
};
public static string PortName
{
get => Port.PortName;
set => Port.PortName = value;
}
public static SerialDataReceivedEventHandler DataReceived
{
set => Port.DataReceived += value;
}
public static void OpenCOMPort()
{
try
{
Port.Open();
Port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
}
catch(Exception ex)
{
Debug.Print("Exception caught while opening " + Port.PortName + Environment.NewLine + ex.ToString());
}
}
public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
Byte[] rx_buffer = new Byte[ReadLength]; // ReadLength is set elsewhere
try
{
for (int i = 0; i < ReadLength; i++)
{
rx_buffer[i] = (Byte)Port.ReadByte();
}
// update the viewModel with the data in rx_buffer here?!
}
catch(Exception ex)
{
if (Port.IsOpen)
{
Port.ReadExisting(); // Clears input buffer
}
Debug.Print(ex.ToString());
}
}
Всякий раз, когда я получаю данные через DataReceivedHandler (), я хочу сообщить viewModel, что есть новые данные для отображения и сохранить их в моей модели (это только полученные байты и цвет, связанный со значением первого байт).
Каков наилучший способ сообщить об этом в viewModel?
Я также пытался обновить модель непосредственно из класса SerialPortService, но я получил ошибку, связанную со схожестью потоков.
Спасибо!