// Функция для чтения данных напрямую с датчика private void readButton_Click(object sender, EventArgs e) { readButton.Enabled = false; saveButton.Enabled = false; try { fileBox.Items.Clear(); fileBox.Update(); byte[] buffer = new byte[8192]; // максимальный пакет 4096 байт, взято с запасом int numb = 0; char[] tempS = new char[200]; long numfiles = 0; long fcur = 0; char[] log_name_c = new char[2048]; System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); //System.Diagnostics.Stopwatch control = new System.Diagnostics.Stopwatch(); if ((validCOM == 0) && (selected_com != "COM0")) { Connect(); //FileStream fs = File.Create(log_name, 2048, FileOptions.None); //StreamWriter str_wr = new StreamWriter(fs); //control.Start(); infoLabel.Text = "Идет считывание"; infoLabel.Update(); active_com.DiscardInBuffer(); timer.Start(); active_com.Write("v"); // запрос версии и номера датчика while (active_com.BytesToRead < 4) { if (timer.ElapsedMilliseconds > 1000) { MessageBox.Show("Не получен ответ от датчика. Проверьте подключение."); Disconnect(); readButton.Enabled = true; return; } } numb = active_com.Read(buffer, 0, 4); if (numb < 4) { MessageBox.Show("Не получен ответ от датчика. Этап 1."); Disconnect(); readButton.Enabled = true; return; } block_index = buffer[0] * (int)Math.Pow(2, 24) + buffer[1] * (int)Math.Pow(2, 16) + buffer[2] * (int)Math.Pow(2, 8) + buffer[3]; active_com.Write("?"); // запрос на количество записей в памяти Thread.Sleep(50); numb = active_com.Read(buffer, 0, 4); numfiles = buffer[0] * (int)Math.Pow(2, 24) + buffer[1] * (int)Math.Pow(2, 16) + buffer[2] * (int)Math.Pow(2, 8) + buffer[3]; active_com.Write("c"); Thread.Sleep(50); // Временная задержка, рабочий вариант numb = active_com.Read(buffer, 0, 4); fcur = buffer[0] * (int)Math.Pow(2, 24) + buffer[1] * (int)Math.Pow(2, 16) + buffer[2] * (int)Math.Pow(2, 8) + buffer[3]; if (numb < 4) { MessageBox.Show("Не получен ответ от датчика. Этап 2."); Disconnect(); readButton.Enabled = true; return; } while (fcur > 1) { active_com.Write("-"); active_com.Read(buffer, 0, 4); Thread.Sleep(20); active_com.Write("c"); Thread.Sleep(20); numb = active_com.Read(buffer, 0, 4); fcur = buffer[0] * (int)Math.Pow(2, 24) + buffer[1] * (int)Math.Pow(2, 16) + buffer[2] * (int)Math.Pow(2, 8) + buffer[3]; } int fsum = 0; progressBar.Maximum = (int)numfiles; progressBar.Value = 0; file file2add; packet packet2add; int file_count = 1; int packet_count = 0; packetBox.Text = "" + packet_count; packetBox.Update(); active_com.ReadTimeout = 500; // maximum amount of time allowed // for perfoming one reading operation for (int q = 0; q < numfiles; q++) { progressBar.Value++; fsum = 0; active_com.Write("r"); Thread.Sleep(40); numb = active_com.Read(buffer, 0, 4); file2add = new file(file_count); // для каждой записи создается новый объект file //str_wr.WriteLine("file " + q + " read bytes: " + numb); while (fsum != 4096 * 255) // выход из цикла если все значения равны FF { fsum = 0; Application.DoEvents(); active_com.Write("n"); Thread.Sleep(40); numb = active_com.Read(buffer, 0, 4096); for (int w = 0; w < numb; w++) fsum += buffer[w]; packet2add = new packet(buffer, numb); // для каждого пакета - новый объект packet file2add.add(packet2add); packet_count++; if (packet_count % 20 == 0) { packetBox.Text = "" + packet_count; packetBox.Update(); } //str_wr.Write(fsum + " "); } if (file2add.get_size() > 4096) { files_q.Enqueue(file2add); // объект file добавляется в очередь file_count++; // только если в нем больше 1 пакета } //str_wr.WriteLine(); } packetBox.Text = "" + packet_count; packetBox.Update(); //str_wr.Flush(); //str_wr.Close(); //control.Stop(); } if (validCOM == 1) { Disconnect(); //MessageBox.Show("Чтение завершено. " + control.ElapsedMilliseconds + " ms elapsed."); saveButton.Enabled = true; flags[1] = true; // this flag is used to keep readButton locked (unavailble) MessageBox.Show("Чтение завершено."); files_st = new file[files_q.Count]; for (int q = 0; q < files_st.Length; q++) { // вывод спика ненулевых записей в textBox files_st[q] = (file)files_q.Dequeue(); fileBox.Items.Add("Запись " + files_st[q].get_id() + " - " + (files_st[q].get_size())/194700 + " мин"); } check_save_available(sender, e); } } catch (Exception crit_error) { MessageBox.Show("Произошла критическая ошибка. Возможные причины ошибки:\n" + "• выбранный СОМ порт не связан с датчиком СКВП\n" + "• датчик выключен\n" + "\n Код ошибки: " + crit_error.Message); if (active_com.IsOpen) active_com.Close(); readButton.Enabled = true; return; } return; }