串口 myPort.Datareceived C#
serial port myPort.Datareceived C#
你好,朋友们有一个 C# 形式,可以从连接的串行设备读取数据,我的问题是我什至改变了方法 myPort.DataReceived 的形式,仍然 运行 宁和接收数据。我无法关闭与串行端口的连接,因为该方法不会停止 excutar。当我更改我的表单时,我尝试了一个命令来压缩它,但是当你尝试 运行 myPort.Close 时它崩溃了,我相信这就是为什么 myPort.DataReceived 仍然 运行 ning,所以我删除了代码,它继续 myPort.Close 以另一种形式打开。我认为我的解决方案是停止 myPort.DataReceived 然后关闭连接,但找不到方法 this.Below 是我的代码的摘录:
namespace EntradaFinalCliente
{
public partial class ConsultaSerial : Form
{
string SerialString;
private SerialPort myport;
public ConsultaSerial()
{
InitializeComponent();
abrirSerial();
lerDados();
}
public void abrirSerial()
{
myport = new SerialPort();
myport.BaudRate = 9600;
myport.PortName = SerialPort1;
myport.DataReceived += myport_DataReceived;
}
private void lerDados()
{
if (myport.IsOpen == false)
{
try
{
myport.Open();
}
catch
{
return;
}
}
}
private void myport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(100);
SerialString = myport.ReadExisting();
this.Invoke(new EventHandler(Analisa));
}
private void Analisa(object sender, EventArgs e)
{
checarSerial();
}
这是我关闭表单的按钮:
private void button1_Click (object sender, EventArgs e)
{
myPort.Close ();
this.Hide ();
var form1 = new Form1 ();
form1.Closed + = (s, args) => this.Close ();
Form1.Show ();
}
您遇到的问题是,一旦事件被触发,您的应用程序就会进入函数 myport_DataReceived
。无论端口是否关闭,函数都会继续执行。如果端口已经关闭,函数将最后一次执行。等待 100 毫秒会使情况变得更糟。所以我的建议是删除等待并在代码周围放置一个 try catch 语句以使线程干净地终止。
此外,使用 sender
读取传入数据比使用成员 myPort
更好,因为 sender
是触发事件的那个。当您打开两个或更多端口时,它还有助于消除混淆。
还建议 DataReceived 事件处理函数的主体应保持最少。只做你需要的事情来获取数据。然后您可以将数据存储在内存中,并使用存储的数据在其他地方进行更复杂的处理。
private void myport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(100); // Why do you need to wait for 100 ms? If the event reaches here, it will have the data to read. Can remove?
try
{
SerialPort sp = (SerialPort)sender;
SerialString = sp.ReadExisting();
this.Invoke(new EventHandler(Analisa));
}
catch (Exception ex)
{
// Do something else
Console.WriteLine(ex.Message);
}
}
你好,朋友们有一个 C# 形式,可以从连接的串行设备读取数据,我的问题是我什至改变了方法 myPort.DataReceived 的形式,仍然 运行 宁和接收数据。我无法关闭与串行端口的连接,因为该方法不会停止 excutar。当我更改我的表单时,我尝试了一个命令来压缩它,但是当你尝试 运行 myPort.Close 时它崩溃了,我相信这就是为什么 myPort.DataReceived 仍然 运行 ning,所以我删除了代码,它继续 myPort.Close 以另一种形式打开。我认为我的解决方案是停止 myPort.DataReceived 然后关闭连接,但找不到方法 this.Below 是我的代码的摘录:
namespace EntradaFinalCliente
{
public partial class ConsultaSerial : Form
{
string SerialString;
private SerialPort myport;
public ConsultaSerial()
{
InitializeComponent();
abrirSerial();
lerDados();
}
public void abrirSerial()
{
myport = new SerialPort();
myport.BaudRate = 9600;
myport.PortName = SerialPort1;
myport.DataReceived += myport_DataReceived;
}
private void lerDados()
{
if (myport.IsOpen == false)
{
try
{
myport.Open();
}
catch
{
return;
}
}
}
private void myport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(100);
SerialString = myport.ReadExisting();
this.Invoke(new EventHandler(Analisa));
}
private void Analisa(object sender, EventArgs e)
{
checarSerial();
}
这是我关闭表单的按钮:
private void button1_Click (object sender, EventArgs e)
{
myPort.Close ();
this.Hide ();
var form1 = new Form1 ();
form1.Closed + = (s, args) => this.Close ();
Form1.Show ();
}
您遇到的问题是,一旦事件被触发,您的应用程序就会进入函数 myport_DataReceived
。无论端口是否关闭,函数都会继续执行。如果端口已经关闭,函数将最后一次执行。等待 100 毫秒会使情况变得更糟。所以我的建议是删除等待并在代码周围放置一个 try catch 语句以使线程干净地终止。
此外,使用 sender
读取传入数据比使用成员 myPort
更好,因为 sender
是触发事件的那个。当您打开两个或更多端口时,它还有助于消除混淆。
还建议 DataReceived 事件处理函数的主体应保持最少。只做你需要的事情来获取数据。然后您可以将数据存储在内存中,并使用存储的数据在其他地方进行更复杂的处理。
private void myport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(100); // Why do you need to wait for 100 ms? If the event reaches here, it will have the data to read. Can remove?
try
{
SerialPort sp = (SerialPort)sender;
SerialString = sp.ReadExisting();
this.Invoke(new EventHandler(Analisa));
}
catch (Exception ex)
{
// Do something else
Console.WriteLine(ex.Message);
}
}