[英]C# Com port close
我需要从Form1
COM
读取数据,然后再次在Form2
读取数据。
什么是最好的方式?
在Form1
读取COM
数据,然后mySerialPort.Close();
,并在Form2
打开新连接?
如果像这样,我上面的代码应该close
它吗?
或者不要关闭COM
? 如果不关闭,我如何读取Form2
的数据?
namespace portreader
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
SerialPort mySerialPort = new SerialPort();
mySerialPort.PortName = "COM3";
mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_DataReceived);
mySerialPort.Open();
}
string _buffer;
private void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (this.InvokeRequired)
{
// Using this.Invoke causes deadlock when closing serial port, and BeginInvoke is good practice anyway.
this.BeginInvoke(new EventHandler<SerialDataReceivedEventArgs>(mySerialPort_DataReceived), new object[] { sender, e });
return;
}
SerialPort sp = (SerialPort)sender;
string data = sp.ReadExisting();
_buffer += data;
if (_buffer.Length >= 8)
{
int chipnumber = Int32.Parse(_buffer, System.Globalization.NumberStyles.HexNumber);
Form2 form2 = new Form2(chipnumber);
form2.ShowDialog(this);
_buffer = null;
}
}
}
}
你需要创建一个form1和form2都可以使用的类,然后给form1和form2一个对该类的引用。
理想情况下,表单根本不知道有串口。 他们只是使用您的类/服务来提问并获得答案,并且封装在该类中是进入串口并进行查询的逻辑。
这是软件的基本设计原则之一,将UI与应用程序逻辑分离。
在另一篇相关文章中看到我的答案
您可以简单地将ComPort
包装在类中
public class DataInput
{
public event Action<string> DataReceived;
private readonly SerialPort mySerialPort;
public DataInput(string portName)
{
mySerialPort = new SerialPort();
mySerialPort.PortName = portName;
mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_DataReceived);
mySerialPort.Open();
}
private void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string received = mySerialPort.ReadExisting();
DataReceived?.Invoke(received);
}
}
现在,每个表单(以及您的软件的其他组件)都可以使用DataInput
实例的事件DataReceived
。 因此,每个组件都可以按照自己喜欢的方式处理数据。 因此,您只需创建DataReceived
的实例并在表单中使用它,如:
public partial class Form1 : Form
{
private readonly DataInput dataInput;
public Form1()
{
InitializeComponent();
dataInput = new DataInput("COM3");
dataInput.dataReceived += OnDataReceived;
}
private void OnDataReceived(string Data)
{
//Do whatever you want with the data
}
}
现在,您可以将dataInput
传递给第二个表单,并且可以再次使用dataReceived
事件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.