首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# WPF串口连续读取数据

C# WPF串口连续读取数据
EN

Stack Overflow用户
提问于 2018-08-04 18:59:03
回答 2查看 9.2K关注 0票数 1

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

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

代码语言:javascript
复制
private void testConnection_Click(object sender, RoutedEventArgs e)
{
    string correctPort = "COM6";
    SerialPortConnection serialPortTestConnection = new SerialPortConnection(correctPort);

}

在我的SerialPortCommunications中,我是这样得到的:

代码语言:javascript
复制
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“会连续返回值(用超级终端测试)。

都会很感谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-05 06:12:25

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

代码语言:javascript
复制
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 ...
    }));
}
票数 4
EN

Stack Overflow用户

发布于 2018-08-04 19:16:14

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51684895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档