Связь с COM-портом в приложении WPF - PullRequest
0 голосов
/ 29 февраля 2012

В проекте WPF я связал элемент управления Polyline с DependencyProperty с типом PointCollection.
Координаты точек должны исходить от метизов (это аппаратная сила физиотерапевтических сил).
Я написал некоторый код в консольном приложении для чтения данных из порта com, и он работает правильно. Я должен использовать код в моем приложении WPF
Коды:

public class Hardware
{
    private SerialPort _serialPort;

    public void TestData()
    {
        InitSerialPort();
        Console.WriteLine("Send data:");
        string input = string.Empty;
        while (input != "exit")
        {
            Thread.Sleep(3000);
            input = "~";
            SendData(input);
        }
    }

    private void SendData(string input)
    {
        if (!_serialPort.IsOpen)
            _serialPort.Open();

        _serialPort.Write(input);
        Console.WriteLine("data '{0}' has been sent to serial port", input);
    }

    private void InitSerialPort()
    {
        _serialPort = new SerialPort("COM5", 9600, Parity.None, 8, StopBits.One)
                          {
                              Handshake = Handshake.None,
                              ReadTimeout = 500,
                              WriteTimeout = 500
                          };

        _serialPort.DataReceived += SerialPortDataReceived;
        _serialPort.Open();
        return;
    }

    private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        Thread.Sleep(2000);
        var buffer = new byte[100];
    double deltaV1 = ((buffer[1]*65535 + buffer[2]*255 + buffer[3])*5)/102400;
        double X = (25.73*deltaV1) + (-4.27);
        double Y = (25.61*deltaV1) + (-3.79);
        Console.WriteLine("X: {0}; Y: {1}", X, Y);
    }
}

В ViewModel я привязал PolyLine к набору точек:

  internal class RadarViewModel : DependencyObject, INotifyPropertyChanged
    {
        public static readonly DependencyProperty PtsProperty =
            DependencyProperty.Register("Pts", typeof (PointCollection), typeof (RadarViewModel),
                                        new UIPropertyMetadata(new PointCollection()));
   public PointCollection Pts
        {
            get { return (PointCollection) GetValue(PtsProperty); }
            set { SetValue(PtsProperty, value); }
        }
    public void AddPoint()
        {
            var rnd = new Random();
            Pts.Add(new Point(rnd.Next(90), rnd.Next(90)));
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("Pts"));
        }

}

Теперь я понятия не имею, как я могу обновить PointCollection, когда данные были прочитаны из COM-порта, чтобы отразить последние изменения оборудования в пользовательском интерфейсе.
Я прочитал несколько статей, как это: Получатели и установщики свойств зависимости в многопоточной среде
Я не знаю, как реализовать в моем сценарии.

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Проблема в том, что вы можете обновлять пользовательский интерфейс только из потока пользовательского интерфейса.

Когда вы получаете данные из SerialPort, вы получаете их в каком-то потоке из пула потоков.Вы должны переключить контекст потока в поток пользовательского интерфейса.И для этой цели вы можете использовать объект Dispatcher .

0 голосов
/ 29 февраля 2012

Обратите внимание, что обработчик событий SerialPort DataReceived запускается / запускается в потоке без пользовательского интерфейса.

private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // create your points
    // INVOKE update to Point collection
}

Поиск в Интернете по запросу wpf thread observablecollection дает многообещающие результаты о том, какиспользовать коллекцию в многопоточной среде.

Вам не нужно знать когда для чтения данных из COM, для этого и нужно событие DataReceived.И это зависит от частоты поступления данных и их количества.Если это действительно часто и много данных, то вы можете отфильтровать некоторые из них и отображать только каждые N обновлений.Если это небольшие куски и не так часто, просто обновляйте их каждый раз.

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