你好朋友在C#中有一个表单从连接的串口设备读取数据,我的问题是我甚至改变了myPort.DataReceived方法仍在运行和接收数据的形式。我无法关闭与串口的连接,因为该方法不会停止excutar。当我改变我的表单时我尝试了拉链的命令,但是当你尝试运行myPort.Close时崩溃了,我相信这就是为什么myPort.DataReceived仍在运行,所以我删除了代码并继续myPort 。以另一种形式关闭。我认为我的解决方案是停止myPort.DataReceived然后关闭连接,但无法找到方法来执行此操作。下面是我的代码的摘录:
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 ();
}

答案 0 :(得分:0)
您遇到的问题是,一旦触发事件,您的应用程序就会进入函数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);
}
}