2015-12-12 8 views
3

, поэтому я передаю данные из Arduino в C# Winform, которая выводит данные в текстовое поле и сохраняет их в файл. Формат передаваемых данных следующий: 18|25|999|100~; первая часть - это время в секундах, которое позволяет мне знать, когда строка была пропущена (Arduino запускает счетчик каждую секунду), символ «~» обозначает конец строки. Эти данные разбиваются на массив (разделяются на '|'), этот массив затем добавляется в список.C# Последовательный порт. Не все данные добавлены в Listview

Данные в текстовом поле идеальны, все данные записаны, ни одна строка не пропущена, но затем я добавляю данные в список, а некоторые строки пропускаются.

private void tData_TextChanged(object sender, EventArgs e) 
    { 
     if (logdata.Checked) 
     { 
      string output = tData.Text; 
      string[] lines = output.Split('\n', '\r'); 
      string last_line = lines[lines.Length - 1]; 

      if (last_line.Contains("~")) 
      { 

       string output1 = tData.Text; 
       string[] lines1 = output1.Split('\n', '\r'); 
       string last_line1 = lines1[lines.Length - 1]; 

       string[] splitdata = last_line1.Split('|'); 



        //side task - not important 
        int time = Convert.ToInt32(Convert.ToString(splitdata[0])); 

        TimeSpan currenttime = TimeSpan.FromSeconds(time); 


        string str = currenttime.ToString(@"hh\:mm\:ss\:fff"); 
        label2.Text = str; 



        //save to file 
        string path = "database.can"; 
        using (StreamWriter sw = File.AppendText(path)) 
        { 
         sw.WriteLine(last_line1); 

        } 
        //check if line exists to prevent doubles 
        ListViewItem item = listView1.FindItemWithText(splitdata[0]); 

        if (item != null) 
        { 
        // it exists 

        } 
        else 
        { 
        //doesn't exist so add it 
        var listViewItem = new ListViewItem(splitdata); 
        listView1.Items.Add(listViewItem); 

        } 



       } 





      } 
     } 

tData - это текстовое поле, в котором записаны все данные. Я был бы очень признателен, если бы кто-то помог мне предотвратить пропуски линий, я за последние несколько дней тянул за волосы. Спасибо, Гейб

+2

Вы слепо предположите, что событие TextChanged запущено, потому что добавлена ​​только одна строка. Он терпит неудачу, когда SerialPort получил более одной строки. Это рано или поздно произойдет, этот код довольно дорог. Подумайте, используя SerialPort.ReadLine(), чтобы вы могли быть уверены, что получите одну строку за раз. Сделайте это легко, используя \ n вместо ~ в качестве терминатора строк. И не пытайтесь прочитать его из TextBox, это слишком дорого. –

+0

@HansPassant спасибо за ваш комментарий, но так как у ардуино есть отсрочка на 1 секунду и отправляет одну строку, то как будут появляться две строки? Событие textchanged запускается несколько раз в строке, потому что каждая строка загружается байт. Я использую символ '~' для обозначения конца строки – Gabe

+0

Вы написали код, который * может * терпеть неудачу таким образом. И, похоже, это не так. Очень мало смысла предполагать, что это не провалится таким образом, тем более, что вы видите, что он терпит неудачу таким образом. Просто исправьте это, чтобы оно не могло случиться. Напишите твердый код вместо кода работоспособности. –

ответ

0

, так что я, наконец, понял, (благодаря @hanspassant), что с помощью Readline() исправляет проблему, прежде чем все байты читались один в то время, что вызвало некоторые линии, которые будут пропущены