我正在尝试构建一个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“会连续返回值(用超级终端测试)。
都会很感谢你的帮助。
发布于 2018-08-05 06:12:25
一般来说,你应该避免使用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 ...
}));
}发布于 2018-08-04 19:16:14
您应该将类SerialPortCommunications的对象放入新线程中,然后开始从COM端口读取数据。另外,如果您需要来自WPF中COM端口的数据,例如TextBlock,您需要在类SerialPortCommunications中创建一个事件,并在WPF中实现一个事件处理程序。但在该处理程序中,您需要使用分派来显示该TextBlock中的数据。
https://stackoverflow.com/questions/51684895
复制相似问题