Как дождаться завершения буфера для добавления последовательных данных в файл - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть некоторый код, который принимает данные последовательного порта, и оба (1) отображают их в окне терминала, а (2) добавляет / записывает данные в файл .txt с меткой времени.

Проблема заключается в том, чточто, хотя данные правильно отображаются в окне терминала в приложении C #, функция AppendToFile будет генерировать несколько файлов, то есть фрагментов / пакетов, которые должны быть сшиты вместе.

Я попытался добавить условный оператор, ища последние символы строки (так как они известны), но это не работает.

Я также пробовал Thread.Спите, ожидая ~ 3-4 секунды, и вместо 4 файлов, которые должны быть сшиты вместе, будут созданы 2 файла, один с первыми несколькими символами строки и второй файл с остальной / большей частью строки.

Вот функция 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);
        }
    }
...