我想读取我的串口,但仅在数据到来时(我不想轮询)。
我就是这样做的。
Schnittstelle = new SerialPort("COM3");
Schnittstelle.BaudRate = 115200;
Schnittstelle.DataBits = 8;
Schnittstelle.StopBits = StopBits.Two;
....
然后我开始一个线程
beginn = new Thread(readCom);
beginn.Start();
在我的readCom中,我正在连续阅读(民意调查:()
private void readCom()
{
try
{
while (Schnittstelle.IsOpen)
{
Dispatcher.BeginInvoke(new Action(() =>
{
ComWindow.txtbCom.Text = ComWindow.txtbCom.Text + Environment.NewLine + Schnittstelle.ReadExisting();
ComWindow.txtbCom.ScrollToEnd();
}));
beginn.Join(10);
}
}
catch (ThreadAbortException)
{
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
我希望你在中断来临时阅读。但是我该怎么做呢?
答案 0 :(得分:32)
您必须向DataReceived事件添加eventHandler。
以下是msdn.microsoft.com上的一个示例,其中包含一些修改内容:查看评论!:
public static void Main()
{
SerialPort mySerialPort = new SerialPort("COM1");
mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
mySerialPort.Open();
Console.WriteLine("Press any key to continue...");
Console.WriteLine();
Console.ReadKey();
mySerialPort.Close();
}
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Debug.Print("Data Received:");
Debug.Print(indata);
}
每次数据进入时,DataReceivedHandler都会触发并将数据打印到控制台。我认为您应该可以在代码中执行此操作。
答案 1 :(得分:5)
您需要在打开端口之前订阅DataReceived事件,然后在触发时监听该事件。
private void OpenSerialPort()
{
try
{
m_serialPort.DataReceived += SerialPortDataReceived;
m_serialPort.Open();
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message + ex.StackTrace);
}
}
private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
var serialPort = (SerialPort)sender;
var data = serialPort.ReadExisting();
ProcessData(data);
}
串行,当缓冲区中有数据时,触发数据接收事件,这并不意味着您一次获得所有数据。您可能需要等待多次才能获得所有数据;在您进行最终处理之前,您需要将接收到的数据分开处理,或者将它们保存在某个地方的缓存中。