输入缓冲区中的串行输出?

时间:2015-05-15 02:43:03

标签: c# .net serial-port

我正在抨击一个C#+ WPF应用程序将串行数据发送到我的数码时钟。

我在使用C#应用程序发送和接收数据时表现不佳,这是我在通过终端程序发送/接收时所不具备的。

在我的C#应用​​程序中,我的串行输出会触发datareceivedhandler。使用终端程序时,我没有回音。

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    DateTime aMoment = DateTime.Now;


    SerialPort aPort = (SerialPort)sender;



    // Because I am updating the UI from a thread other than the main thread.
    this.Dispatcher.Invoke((Action)(() =>
    {

        string indata = aPort.ReadLine();
        string outData = aMoment.ToString("yyyy-MM-dd, HH':'mm':'ss.fff, ") + indata + Environment.NewLine;


        if (chkEnableDatalog.IsChecked == true)
            File.AppendAllText(@txtDatalogPath.Text, outData);

        txtSerialIn.Text = indata;
        txtDataLogLine.Text = outData;

        txtSerialOutHistory.AppendText("<" + indata);

        outData = "";
        indata = "";

    }));
}

有时串行响应的延迟可能很长 - 很多秒 - 使用终端应用程序,我通常会立即得到响应。

以下是我的c#app截图。 &#34;&lt;&#34;表示通过datareceivedhandler接收的数据。其他行是输出。我的时钟有效回复了#34;小时?&#34;是&#34;小时:nn&#34;其中nn是整数1 :: 23。

同样在下面,您可以看到终端程序按预期显示来自串行请求的数据。

http://imgur.com/a/bJXeV

enter image description here

1 个答案:

答案 0 :(得分:0)

首先读取数据然后在当前线程中,然后调用invoke来更新UI

private void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e) {     DateTime aMoment = DateTime.Now;

SerialPort aPort = (SerialPort)sender;
string indata = aPort.ReadLine(); <<<-- Read data before invoke.


// Because I am updating the UI from a thread other than the main thread.
this.Dispatcher.Invoke((Action)((indata ) =>
{

    string outData = aMoment.ToString("yyyy-MM-dd, HH':'mm':'ss.fff, ") + indata + Environment.NewLine;


    if (chkEnableDatalog.IsChecked == true)
        File.AppendAllText(@txtDatalogPath.Text, outData);

    txtSerialIn.Text = indata;
    txtDataLogLine.Text = outData;

    txtSerialOutHistory.AppendText("<" + indata);

    outData = "";
    indata = "";

}));

}