为了账号安全,请及时绑定邮箱和手机立即绑定

C# WPF 串口连续读取数据

C# WPF 串口连续读取数据

C#
慕姐4208626 2021-11-14 17:31:05
我正在尝试构建一个 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”会不断返回值(用超级终端测试)。将不胜感激任何帮助。
查看完整描述

2 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

一般来说,您应该避免使用 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 ...

    }));

}


查看完整回答
反对 回复 2021-11-14
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

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


查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 722 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信