gpt4 book ai didi

c# - 在 WPF 中从串口接收数据时做一些事情

转载 作者:行者123 更新时间:2023-11-30 17:34:35 26 4
gpt4 key购买 nike

我想创建一个程序,根据“实时”接收到的数据以任何方式为椭圆着色。数据类似于:x1-1x2-1

我有一个奇怪的问题,我在调试时看到,填充椭圆的颜色应该改变,但它没有发生。

接收数据的部分代码:

 private void ReceiveData()
{
SerialPort serialPort = new SerialPort("COM1", 9600);
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
serialPort.Open();
}

private static void DataReceivedHandler(
object sender,
SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
if (indata.Contains(" "))
{
testString = indata.Substring(0, 4);

}
Console.Write(indata);
}

我可以在控制台中看到接收到的数据,即使在单击按钮后,它也开始接收数据。 testString是从indata中提取单个x1-1,它在接收数据的过程中还在增长。我知道它不能正常工作,但现在没关系。

按钮上的 Action 代码:

 private void button1_Click(object sender, RoutedEventArgs e)
{
ReceiveData();
while (true)
{
if (testString == "x1-1") x1.Fill = Brushes.Blue;
else x1.Fill = Brushes.Red;
}
}

x1 是我想要制作红色或蓝色的椭圆。我可以在这个函数中设置断点,我可以看到它应该改变。我认为问题是,那个程序正在等待关闭端口并完成传输,然后它可能会改变,但我需要“实时”地拥有它。有人知道怎么做吗?

最佳答案

我相信你的做法是错误的。无需不断检查 teststring 的值,您只需启动通信端口监听器并让它在后台运行 - 因为这将在它自己的线程上运行。然后您需要为颜色创建一个数据绑定(bind)。每当 comm 端口监听器解析一个字符串时,它可以自动更新颜色。

首先,在 CommPort 类中:

class MyCommPort : INotifyPropertyChanged
{
SerialPort serialPort = null;
public MyCommPort()
{
serialPort = new SerialPort("COM3", 9600);
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
serialPort.Open();
}
~MyCommPort()
{
serialPort.Close();
}

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string testString = null;
string indata = sp.ReadLine();
if (indata.Length >= 4)
{
testString = indata.Substring(0, 4);
// Update the value
if (testString == "x1-1") EllipseBrush = Brushes.Blue;
else EllipseBrush = Brushes.Red;
}
Console.Write(testString);
}

// Create a property that will be bound
private SolidColorBrush ellipseBrush = Brushes.Red;
public SolidColorBrush EllipseBrush
{
get { return ellipseBrush; }
set
{
ellipseBrush = value;
OnPropertyChanged("EllipseBrush");
}
}

// Extend the INotifyPropertyChanged interface
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
// Alert anyone bound to this that the value has changed
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}

然后,将 Ellipse 的 DataContext 设置为 CommPort 类,并将 Ellipse 的 Fill 属性绑定(bind)到 EllipseBrush。现在您所要做的就是启动 Commport 监听器 (ReceiveData();),颜色更新应该会自动发生。

例如:MainWindow.xaml

<Window x:Class="delete_me.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Ellipse x:Name="ellipse" Fill="{Binding Path=EllipseBrush}" />
</Grid>
</Window>

以及背后的代码:MainWindow.xaml.cs

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ellipse.DataContext = new MyCommPort();
}
}

关于c# - 在 WPF 中从串口接收数据时做一些事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42258470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com