串口-我不能在port_received方法中调用form和ShowDialog
本文关键字:方法 调用 form ShowDialog received 不能 port 串口 | 更新日期: 2023-09-27 18:08:39
我正在监听端口,一旦我收到消息,做一些处理,而不是插入到数据库中。到目前为止一切顺利。问题是,在port_received的方法中,我想弹出显示设备接收到消息的形式,并取决于用户单击OK并查看消息。在弹出式表单的背景有一个定时器和关闭的形式在2秒,除非用户不点击按钮看到的消息。我调用的形式比.ShowDialog()
之后,我失去了我的串口通信。如果我用.Show()
,我不能正确地看到部分代码:
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
data = comport.ReadLine();
ReceiveMessagePopup popUp = new ReceiveMessagePopup(data);
popUp.Location = new Point(150, 150);
popUp.ShowDialog();
/// after that code I cannot do anything even cannot show any MessageBox.
}
我不会在该方法中放置ShowDialog
或任何其他UI管理,因为它可以在收到数据后多次引发。
我认为事件处理程序应该只是接收和存储数据的地方和ShowDialog
或其他通知或UI处理应该完成的方法。
如何在c#中使用SerialPort端口对象的dataReceived事件?
来自MSDN关于SerialPort的文章。DataReceived
"当从SerialPort对象接收数据时,在次要线程上引发DataReceived事件。由于此事件是在辅助线程而不是主线程上引发的,因此尝试修改主线程中的某些元素(如UI元素)可能会引发线程异常。如果需要修改主Form或Control中的元素,请使用Invoke返回更改请求,它将在适当的线程上完成工作。"
使用控制。BeginInvoke在主UI线程上执行代码以显示对话框。例如
假设此代码位于继承Form
的类中var data = comport.ReadLine();
_buffer.Append(data);
if (_buffer.IsValid)
{
BeginInvoke((Action) (() =>
{
ReceiveMessagePopup popUp = new ReceiveMessagePopup(buffer);
popUp.Location = new Point(150, 150);
popUp.ShowDialog();
}));
}
你不想做长时间运行的任务时,大卫。指出,对话框显示每次提出的事件是可能不是一个好主意,因为你可能会得到许多事件,即使是一行的数据串行端口,所以这就是为什么我添加端口读取的数据缓冲区,如果缓冲区是有效的(例如,包含一个全/信息/包/无论行)然后显示对话框