C# 新线程上的SerialPort缓冲区
我有一个从FormGUI访问的MySerialPort类/对象。创建MySerialPort对象后,我想打开它,并持续接收数据。数据将在对象的数据缓冲区中存储和管理。FormGUI的memoEdit将显示从MySerialPort对象的缓冲区接收到的代码 如何将新线程与[port].ReadExisting方法一起使用C# 新线程上的SerialPort缓冲区,c#,multithreading,C#,Multithreading,我有一个从FormGUI访问的MySerialPort类/对象。创建MySerialPort对象后,我想打开它,并持续接收数据。数据将在对象的数据缓冲区中存储和管理。FormGUI的memoEdit将显示从MySerialPort对象的缓冲区接收到的代码 如何将新线程与[port].ReadExisting方法一起使用 using System; using System.IO.Ports; using System.Threading; class MySerialPort { pub
using System;
using System.IO.Ports;
using System.Threading;
class MySerialPort
{
public SerialPort CreatePort(string portName, int portSpeed, int portParity, int portDataSize, int portStopBits)
{
// fixed values while testing
var port = new SerialPort("COM6", 9600, Parity.None, 8, StopBits.One);
return port;
}
public void OpenPort(SerialPort port)
{
port.Open();
new Thread(() => port.ReadExisting).Start();
while (true)
{
// Send to buffer
// Maybe some break condition
}
}
Observer模式现在正在工作,我从串行端口获得了预期的数据,谢谢Henk
public partial class MyGUI : Form
{
private MySerialPort MyPort = new MySerialPort();
public MyGUI()
{
InitializeComponent();
MyPort.OnDataBufferUpdate += DisplayNewData;
}
public void DisplayNewData(object sender, EventArgs e)
{
if (this.InvokeRequired)
{
BeginInvoke(new MethodInvoker(delegate() { DisplayNewData(sender, e); }));
}
else
{
memoEdit.Text = MyPort.DataBuffer;
}
}
}
public class MySerialPort
{
public MySerialPort()
{
// Initialize serial port
_Port.DataReceived += _Port_DataReceived;
}
public delegate void HandleDataBufferUpdate(object sender, EventArgs e);
public event HandleDataBufferUpdate OnDataBufferUpdate = delegate {};
private void _Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// Set _Port.DataBuffer from serial port buffer, then activate event below to signal form
OnDataBufferUpdate(this, EventArgs.Empty);
}
}
首先,想想你们班应该做什么。serialport类不应尝试对UI执行反线程处理。已使用我到目前为止的更新代码。当激活_Port_DataReceived事件时,将读取串行端口缓冲区,并根据当前所需的数据类型,将数据字符串存储在_DataBuffer中,当在_Port_DataReceived事件结束时调用OnDataBufferUpdate事件时,该字符串以公共DataBuffer的形式被调用,添加_Port+=_Port\u DataReceived;。DisplayNewData需要处理调用所需的逻辑。帮自己一个大忙,在XxEventArgs中传递一份数据副本。是的,捕获到缺少的事件处理程序声明:_Port.DataReceived+=_Port_DataReceived;,然后得到著名的跨线程操作无效:控件“memoEdit”是从创建它的线程以外的线程访问的。错误,这与您提到的invokererequired逻辑有关。谢谢,我看到了一些进展。我注意到OnDataBufferUpdate事件是在私有事件处理程序中触发的,没有任何后果,因为该事件被声明为公共事件。