c#如何相应地捕获数据

时间:2015-06-24 02:16:44

标签: c# string

目前,我从串口接收数据字符串(RxString)。如

T 22 27.0
T 22 27.0
T 21 25.0
T 22 26.8

逐行..

首先,我尝试拆分字符串以提取中间数字以供比较。

string[] number = RxString.Split(' ');
string unit = split[1];

然后我通过

进行比较
int count = 0;
string x = "";
if (x == unit)
        {
            count++;
        }
        else
        {
            count = 1;
            x = unit;
        }
        if (count == 4)
        {
            StreamWriter MyStreamWriter = new StreamWriter(@"C:\Users\acer\Documents\Data3.txt", true);  //True tell SW to append to file instead of overwriting
            MyStreamWriter.Write(time + "      " + RxString + "\r\n");  //Write time + string
            MyStreamWriter.Flush();
            MyStreamWriter.Close();
            count = 0;  //reset count
        }

我的期望是:

  1. 我需要将所有传入的数据捕获到txt文件中。

  2. 对于“感知”的4个相同数据,我需要对数据格式进行一些编辑,例如只记录没有时间戳的数据。

  3. 表示传入数据是否为:

    T 22 24.0
    T 22 24.0
    T 22 24.0
    T 22 24.0
    T 23 26.7
    T 20 25.0
    

    然后我的.txt文件中应该出现的是

    T 22 24.0
    T 22 24.0
    T 22 24.0
    T 22 24.0
    10:24:20 T 23 26.7
    10:24 40 T 20 25.0
    

    问题是:

    1. 这只捕获了第4个传入数据,剩下的数据都丢失了......我明白我应该添加编写器代码但是当我尝试将它们复制并粘贴到第一个if-else循环时,系统停止运行。

    2. 如果我将编写器编码放在if-else / if循环之外,系统只是将所有数据都捕获到txt文件中。

    3. 有没有更好的方法来实现streamwriter功能?

      private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
          {
      
              string time = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss.ff");
              RxString = serialPort1.ReadLine();
      
              string[] split = RxString.Split('.');  //split RxString at '.'
              string dp = split[1];                 //dp contains digit behind '.'
              Char c = dp[0];                      //c = first decimal place
              split[1] = c.ToString();
              RxString = split[0] + "." + split[1];  //Re-combine Rxstring
      
              this.Invoke(new EventHandler(DisplayText));
      
              string[] number = RxString.Split(' ');
              string unit = split[1];
      
              if (x == unit)
              {
                  count++;
              }
              else
              {
                  count = 1;
                  x = unit;
              }
              if (count == 4)
              {
      
                  StreamWriter MyStreamWriter = new StreamWriter(@"C:\Users\acer\Documents\Data3.txt", true);  //True tell SW to append to file instead of overwriting
                  MyStreamWriter.Write(time + "      " + RxString + "\r\n");  //Write time + string
                  MyStreamWriter.Flush();
                  MyStreamWriter.Close();
                  count = 0;  //reset count
              }
      

1 个答案:

答案 0 :(得分:0)

  
    
        
  1. 我需要将所有传入的数据捕获到txt文件中。
  2.        

然后文件需要保持打开状态,对于RxString的每个记录,您需要写入打开的流;

  
    
        
  1. 对于“感知”的4个相同数据,我需要对数据格式进行一些编辑,例如只记录没有时间戳的数据。
  2.        

您的if / else逻辑似乎没问题,但流编写器经常打开和关闭。

IO进程非常昂贵,open / close / flush会占用CPU时间。建议将IO持久性放在一个单独的线程中,这样就不会阻塞你的串口读取,否则你可能会丢失数据。

您可以尝试log4net进行数据记录。