使用 Arduino 期间的 WPF 数据绑定

WPF databinding during using the Arduino

我正在使用 C# 开发一个应用程序,Arduino.I 从 Arduino 读取值并在 textbox.I 上设置值 希望始终从 Arduino 读取值并将其设置在 interface.However 上代码不工作。 我应该在不同的线程中运行 while 语句吗?

这是我的代码

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

        }
        port.Close();

    }

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

这是开始的代码(放在构造函数中,window 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();
});

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

_stop = true;

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

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

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

    }

 });

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

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

这是一个基本的视图模型class:

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。 属性 SerialMessages 可以绑定到列表框。