如何等待缓冲区完成以将串行数据附加到文件

时间:2019-04-01 14:48:20

标签: c# serial-port buffer

我有一些获取串行端口数据的代码,(1)在终端窗口中显示它们,(2)将数据追加/写入带时间戳的.txt文件。

问题在于,尽管数据在C#应用程序的终端窗口中正确显示,但AppendToFile函数将生成多个文件,即必须缝合在一起的块/数据包。

我尝试添加条件语句,查找字符串的最后一个字符(因为已知),但这不起作用。

我也尝试了Thread.Sleep,等待大约3-4秒,这将生成2个文件,而不是生成需要缝合的4个文件,其中一个文件包含字符串的前几个字符,第二个文件以及字符串的其余/大部分。

这是AppendToFile函数:

   private void AppendToFile(string toAppend)
    {
      string myFilePath = string.Format(@"C:\Battery_Report-{0:yyyy-MM-dd_hh-mm-ss-tt}.txt", DateTime.Now);
      File.AppendAllText(myFilePath, toAppend);
    }

这是不带条件语句的数据接收功能:

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
        // If the com port has been closed, do nothing
        if (!comport.IsOpen) 
  {
    return;
  }

  if (CurrentDataMode == DataMode.Text)
  {
    // Read all the data waiting in the buffer
    string data = comport.ReadExisting();

    if (data.Contains(" NOT ENTERED     "))
    {
        // Display the text to the user in the terminal
        Log(LogMsgType.Incoming, data);

        // Append data to text file and save it on the common drive
        AppendToFile(data);
    }
  }

}

或不带有if语句:

if (CurrentDataMode == DataMode.Text)
  {
    // Read all the data waiting in the buffer
    string data = comport.ReadExisting();

        // Display the text to the user in the terminal
        Log(LogMsgType.Incoming, data);

        // Append data to text file and save it on the common drive
        AppendToFile(data);
  }

同样,问题在于,尽管数据在C#应用程序的终端窗口中正确显示,但AppendToFile函数将生成多个文件,即应全部包含在单个文件中的块/数据包。

由于我的一位同事和jdweng的帮助,找到了解决方案:

  if (CurrentDataMode == DataMode.Text)
  {
      // Read all the data waiting in the buffer
      string data = comport.ReadExisting();
      var done = false;
            while (done == false)
            {
                data = data + comport.ReadExisting();
                if(data.Contains("NCR18650BF"))
                {

                    // Append data to text file and save it on the common drive
                    AppendToFile(data);
                    done = true;
                }
            }
            // Display the text to the user in the terminal
            Log(LogMsgType.Incoming, data);
            rtfTerminal.Refresh();
            Thread.Sleep(100);
        }
    }

0 个答案:

没有答案