我正在抨击一个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。
同样在下面,您可以看到终端程序按预期显示来自串行请求的数据。
答案 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 = "";
}));
}