我正在为WPF中的应用程序开发串行监视器,并使用C#进行编程。
我在管理DataReceived事件时遇到了麻烦,因为我想要一个像HyperTerminal或TeraTerm这样的实时监视器(我不使用它们是因为我希望我的终端成为以太网通信工具的一部分,直到我已经使用winPcap开发过) 。
我必须从微控制器读取一些数据,然后将其显示在textBox上(它只打印菜单和可用命令列表),完成加载顺序后,我想与之进行交互,没什么特别的,只需发送一个“ flash-“命令对板的fpga进行编程。
当我尝试使用接收到的数据更新textbox.text时,我的应用程序异常。我尝试在任何地方搜索,但是尽管有很多示例,但我没有发现可以正确解释代码的内容。
这是代码,在此先感谢
namespace WpfApplication1 {
/// <summary>
/// Interaction logic for SerialMonitor.xaml
/// </summary>
public partial class SerialMonitor : Window {
//VARIABLES
public SerialPort comPort = new SerialPort();
public SerialMonitor() {
//initialization
InitializeComponent();
scanPorts();
}
private void scanPorts() {
textBoxIndata.Clear();
string[] ports = SerialPort.GetPortNames();
foreach (string port in ports) {
comboBoxPorts.Items.Add(port);
}
}
private void openComBtn_Click(object sender , RoutedEventArgs e) {
comPort.Parity = Parity.None;
comPort.DataBits = 8;
comPort.ReadTimeout = 500;
comPort.StopBits = StopBits.One;
if (comboBoxPorts.SelectedItem != null && comboBoxPorts.SelectedItem != null) {
comPort.PortName = comboBoxPorts.SelectedItem.ToString();
comPort.BaudRate = Convert.ToInt32(comboBoxBaud.Text);
try {
//Open port and add the event handler on datareceived
comPort.Open();
comPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
}
catch (Exception ex) {
MessageBox.Show(ex.ToString());
}
}
if (comPort.IsOpen) {
label1.Content = "COM PORT OPEN";
}
}
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) {
}
//function to update the textBox, didn't manage to get it working
private void updateUI (string s) {
}
//CLOSE AND EXIT BUTTONS
private void closeComBtn_Click(object sender , RoutedEventArgs e) {
if (comPort.IsOpen) {
comPort.Close();
label1.Content = "COM PORT CLOSED";
}
}
private void exitBtn_Click(object sender , RoutedEventArgs e) {
if (comPort.IsOpen) {
comPort.Close();
}
this.Close();
}
}
}
我现在遇到的问题是,当我使用SerialPort.Write(string cmd)发送命令时,我无法读回答案...
编辑:修复了所有问题,如果有人对这样的工具编程感兴趣,我将发布代码:)
最佳答案
DataReceived
事件在另一个/辅助线程上返回,这意味着您将必须重新编排回UI线程才能更新您的TextBox
SerialPort.DataReceived Event
当数据被写入时,在辅助线程上引发DataReceived事件。
从SerialPort对象接收。因为此事件是在
次要线程而不是主线程,试图修改一些
主线程中的元素(例如UI元素)可能会引发
线程异常。如果有必要修改主
表单或控件,使用Invoke将更改请求发回,
在适当的线程上工作。
您可以使用Dispatcher.BeginInvoke
或Dispatcher.Invoke Method
将其编组回主线程
精品
Application.Current.Dispatcher.Invoke(new Action(() => { /* Your code here */ }));
要么
someControl.Dispatcher.Invoke(new Action(() => { /* Your code here */ }));
关于c# - 串行监视器,DataReceived处理程序误解了C#,WPF,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50619833/