使用 Arduino 期间的 WPF 数据绑定

本文关键字:WPF 数据绑定 Arduino 使用 | 更新日期: 2023-09-27 18:36:22

我正在开发一个带有C#和Arduino.I的应用程序,从Arduino读取值并在文本框中设置值。我希望始终从Arduino读取值并将其设置在界面上。但是,此代码不起作用。我在不同的线程中运行语句?

这是我的代码

     SerialPort port = new SerialPort("COM4", 9600);
        port.Open();
        while (true)
        {
            String s=port.ReadLine();
            txtValue.Text=s;
        }
        port.Close();
    }

我希望显示我从Arduino读取的值同时显示在文本框中。

使用 Arduino 期间的 WPF 数据绑定

这是

要启动的代码(将其放在构造函数,窗口Loaded或按钮单击事件中):

Task.Run(() =>
{
    _stop = false; // define as private field of window class
    var port = new SerialPort("COM4", 9600);
    port.Open();
    while (!_stop)
    {
        var s=port.ReadLine();
        Dispatcher.Invoke(() => txtValue.Text = s); // InvokeAsync?
    }
    port.Close();
});

这是停止的代码(将其放入窗口Closing事件):

_stop = true;

这不使用任何绑定,但应该让你了解如何组织端口操作(有或没有绑定)。

我不能和arduino方面说话,但是如果您使用的是.net 4.0或4.5,则可以执行以下操作:

Task myTask = Task.Factory.StartNew(() => {
    while (true)
    {
        String s=port.ReadLine();
        txtValue.Text=s;
    }
 });

正如Sinatr所提到的,一定要有办法停止执行。您可以通过设置一个 vairable 而不是使用"true"来做到这一点。至于将代码放在哪里,这实际上取决于您的最终程序是什么。

使用 MVVM Light 和 SolidSoils4Arduino,您应该能够快速创建带有 Arduino 串行消息的可观察绑定。

下面是一个基本的视图模型类:

public class MainViewModel : GalaSoft.MvvmLight.ViewModelBase, IObserver<string>
{
    #region Fields
    private string _lastSerialMessageReceived;
    private readonly ObservableCollection<string> _serialMessages = new ObservableCollection<string>(); 
    #endregion
    #region Constructors
    public MainViewModel()
    {
        var connection = new Solid.Arduino.SerialConnection("COM3", Solid.Arduino.SerialBaudRate.Bps_115200);
        var session = new Solid.Arduino.ArduinoSession(connection);
        session.CreateReceivedStringMonitor().Subscribe(this);
    }
    #endregion
    #region Public Interface
    public void OnCompleted()
    {
        throw new NotImplementedException();
    }
    public void OnError(Exception error)
    {
        throw new NotImplementedException();
    }
    public void OnNext(string value)
    {
        _serialMessages.Add(value);
        LastSerialMessageReceived = value;
    }
    public ObservableCollection<string> SerialMessages
    {
        get { return _serialMessages; }
    }
    public string LastSerialMessageReceived
    {
        get { return _lastSerialMessageReceived; }
        private set { Set(() => LastSerialMessageReceived, ref _lastSerialMessageReceived, value); }
    }
    #endregion
}

您可以将文本框绑定到属性 LastSerialMessageReceived。属性串行消息可以绑定到列表框。