, поэтому я передаю данные из 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 - это текстовое поле, в котором записаны все данные. Я был бы очень признателен, если бы кто-то помог мне предотвратить пропуски линий, я за последние несколько дней тянул за волосы. Спасибо, Гейб
Вы слепо предположите, что событие TextChanged запущено, потому что добавлена только одна строка. Он терпит неудачу, когда SerialPort получил более одной строки. Это рано или поздно произойдет, этот код довольно дорог. Подумайте, используя SerialPort.ReadLine(), чтобы вы могли быть уверены, что получите одну строку за раз. Сделайте это легко, используя \ n вместо ~ в качестве терминатора строк. И не пытайтесь прочитать его из TextBox, это слишком дорого. –
@HansPassant спасибо за ваш комментарий, но так как у ардуино есть отсрочка на 1 секунду и отправляет одну строку, то как будут появляться две строки? Событие textchanged запускается несколько раз в строке, потому что каждая строка загружается байт. Я использую символ '~' для обозначения конца строки – Gabe
Вы написали код, который * может * терпеть неудачу таким образом. И, похоже, это не так. Очень мало смысла предполагать, что это не провалится таким образом, тем более, что вы видите, что он терпит неудачу таким образом. Просто исправьте это, чтобы оно не могло случиться. Напишите твердый код вместо кода работоспособности. –