У меня есть простое приложение Windows Forms, которое получает телеметрию через последовательный интерфейс и представляет ее с помощью полос и чисел в небольшом окне.
Будучи полным новичком в C # и никоим образом не осваивая концепцию объектно-ориентированного программирования, я собрал ее в основном, читая чужой код.
Архитектура очень проста и прагматична.У меня есть обработчик событий, который читает и анализирует входящий поток байтов, и когда полное сообщение было получено, он устанавливает глобальное логическое значение true.Параллельно происходит периодическая проверка событий на истинность этого глобального логического значения и, если да, обновление отображения.Я бы предпочел либо просто обновить отображение из обработчика событий последовательного порта (это очень просто, просто обновить значение нескольких индикаторов выполнения и меток), либо получить событие обновления дисплея, вызванное сообщением, полученным вместо периодического издания.Я тоже не смог этого сделать, я изо всех сил стараюсь разобраться с механикой публичных / приватных / потоков.
Вот некоторый псевдокод моего приложения:
namespace ACOM_Controller
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
OpenSerial(); // open serial port with correct speed etc.
port.DataReceived += Port_OnReceiveData; // DataReceived Event Handler
// Set up timer with 50ms period for updating display
System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(OnTimer);
dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 50);
dispatcherTimer.Start();
}
private static void Port_OnReceiveData(object sender, SerialDataReceivedEventArgs e)
{
// Parse and decode telemetry messages over serial port
// Set NewMessageAvailable = true every time done
}
private void OnTimer(object sender, EventArgs e)
{
if (NewMessageAvailable)
{
// Update displayed dat/bars
NewMessageAvailable = false;
}
}
}
}
Любая помощь или указатели будут с благодарностью.