C#WPF串行端口连续读取数据



我正在尝试构建一个WPF应用程序,该应用程序将从串行端口读取数据,并且不会阻塞UI线程,但我有点拘泥于如何做到这一点。

我在*.xaml.cs文件中得到了如下代码

private void testConnection_Click(object sender, RoutedEventArgs e)
{
string correctPort = "COM6";
SerialPortConnection serialPortTestConnection = new SerialPortConnection(correctPort);
}

在我的SerialPortCommunications中,我得到了这样的信息:

public SerialPortCommunications(string comPort)
{
SerialPort mySerialPort = new SerialPort(comPort);
mySerialPort.BaudRate = 2400;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 7;
mySerialPort.Handshake = Handshake.None;
mySerialPort.Encoding = ASCIIEncoding.ASCII;
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
mySerialPort.Open();
mySerialPort.WriteLine("C");
}
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
String s = sp.ReadExisting();
if (s == "r")
{
Console.WriteLine(tempReadingString);
tempReadingString = string.Empty;
} else
{
tempReadingString += s;
}
}

我确实收到了设备的第一个响应,但在那之后,即使端口保持打开,它也会停止。我确信,传递值"C"会连续返回值(使用Hyperterminal测试(。

如果有任何帮助,我将不胜感激。

一般来说,您应该避免使用ReadExisting,它有已知的问题,特别是当传入流包含二进制数据时。我是这样做的:

this.SerialDevice = new SerialPort(this.Port);
this.SerialDevice.BaudRate = 115200;
this.SerialDevice.DataReceived += OnDataReceived;
this.SerialDevice.Open();
...
private void OnDataReceived(object sender, SerialDataReceivedEventArgs e)
{
var serialDevice = sender as SerialPort;
var buffer = new byte[serialDevice.BytesToRead];
serialDevice.Read(bytes, 0, buffer.Length);
// process data on the GUI thread
Application.Current.Dispatcher.Invoke(new Action(() => {
... do something here ...
}));
}

您应该将类SerialPortCommunications的对象放在一个新线程中,然后开始从COM端口读取数据。此外,如果您需要WPF中COM端口的数据,例如TextBlock,则需要在类SerialPortCommunication中创建一个事件,并在WPF中实现一个事件处理程序。但在该处理程序中,您需要使用Dispatching来显示该TextBlock中的数据。

最新更新