猿问

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”会不断返回值(用超级终端测试)。


将不胜感激任何帮助。


慕姐4208626
浏览 723回答 2
2回答

波斯汪

一般来说,您应该避免使用 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,您需要在 SerialPortCommunications 类中创建一个事件,并在 WPF 中创建一个事件处理程序。但是在该处理程序中,您将需要使用 Dispatching 来显示该 TextBlock 中的数据。
随时随地看视频慕课网APP
我要回答