使用 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 可以绑定到列表框。
我正在使用 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 可以绑定到列表框。