Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
36 / 34 / 20
Регистрация: 17.03.2015
Сообщений: 175
.NET 4.x

Чтение COM - порта

20.01.2017, 13:28. Показов 4342. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Опишу для начала свой проект.
У меня есть устройство АКИП. Я пишу программу для дистанционной работы с ним. Все хорошо, но есть одна проблема.
А проблема заключается в чтении данных с данного устройства.

У меня есть таймер, который читает параметры:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
private void timer_update_current_Tick(object sender, EventArgs e)
        {
            try
            {
                if (index == dataGridView1.Rows.Count - 1)
                {
                    timer_update_current.Stop();
                }
                else if (index < dataGridView1.Rows.Count - 1)
                {
                    proc_work.SelectedIndex = proc_work.Items.Count - 1;
                    var value = current_vol.Text;
                    value = value.Replace(".", ",");
                    min_string = Convert.ToDecimal(value);
 
                    if (target_port.IsOpen)
                    {
                        if (min_string > min_user)
                        {
                            String current_volt = "MEAS:Volt?;";
                            byte[] outByte = Encoding.UTF8.GetBytes(current_volt);
                            target_port.Write(outByte, 0, outByte.Length);
 
                            Thread.Sleep(250);
 
                            try
                            {
                                byte[] inputByte = new byte[9];
                                target_port.Read(inputByte, 0, inputByte.Length);
                                string curr = Encoding.ASCII.GetString(inputByte);
                                curr = System.Text.RegularExpressions.Regex.Replace(curr, @"\s+", " ");
 
                                this.BeginInvoke(new delegate_for_monitoring_current_voltage(add_current_voltage), new object[] { curr });
                            }
                            catch (TimeoutException) { }
 
                            Thread.Sleep(20);
 
                            String current_ampere = "MEAS:CURR?;";
                            byte[] outAp = Encoding.UTF8.GetBytes(current_ampere);
                            target_port.Write(outAp, 0, outAp.Length);
 
                            Thread.Sleep(250);
 
                            try
                            {
                                byte[] inAp = new byte[9];
                                target_port.Read(inAp, 0, inAp.Length);
                                string ampere = Encoding.ASCII.GetString(inAp);
                                ampere = System.Text.RegularExpressions.Regex.Replace(ampere, @"\s+", " "); ;
 
                                this.BeginInvoke(new delegate_for_monitoring_current_ampere(add_current_ampere), new object[] { ampere });
                            }
                            catch (TimeoutException) { }
 
                            Thread.Sleep(20);
 
                            String current_power = "MEAS:POW?;";
                            byte[] outPower = Encoding.UTF8.GetBytes(current_power);
                            target_port.Write(outPower, 0, outPower.Length);
 
                            Thread.Sleep(250);
 
                            try
                            {
                                byte[] inPower = new byte[9];
                                target_port.Read(inPower, 0, inPower.Length);
                                string power = Encoding.ASCII.GetString(inPower);
                                power = System.Text.RegularExpressions.Regex.Replace(power, @"\s+", " ");
 
                                this.BeginInvoke(new delegate_for_moniroting_current_power(add_current_power), new object[] { power });
                            }
                            catch (TimeoutException) { }
 
                            if (proc_work.Items.Count > 0)
                                proc_work.SelectedItem = proc_work.Items.Count;
 
                            this.update_current();
                        }
                        else if(min_string <= min_user)
                        {
                            dataGridView1.Rows[0].Selected = true;
                            stage_timer.Stop();
                            timer_update_current.Stop();
                            target_port.Write("load off ;");
                            dataSource.Add("__________________________________________________________________");
                            dataSource.Add(DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString() +
                                " - тест завершен по достижению \n минимального значения напряжения.");
                            dataSource.Add("Значение напряжения по окончанию: " + current_vol.Text);
                            dataSource.Add("Этапов пройдено: " + count_stage);
                            dataSource.Add("Затраченное время: " + stopw.Elapsed.ToString());
                            
                            MessageBox.Show("Процесс тестирования завершен по достижению минимального значения напряжения." + "\n" +
                            "Количество пройденных этапов: " + num_stage.Text + "\n" + "\n" +
                            "Затраченное время: " + stopw.Elapsed.ToString(), 
                            "Конец тестирования", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                    else
                    {
                        control_tab.SelectedIndex = 2;
                        qDebug.Items.Add(DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString() +
                                " >> " + "Устройство не доступно! Проверьте подкючение..." + "\n");
                    }
                }
            }
            catch (Exception error)
            {
                qDebug.Items.Add(DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString() + " >> " + error.Message + "\n" + error.ToString() + "\n");
                return;
            }
        }
В ней все работает, хорошо.

Теперь о проблеме:
В данной функции я испольную задержки с помощью
C#
1
Thread.Sleep(250);
Данные приходят хорошо, без потерь.
Но когда я убираю задержку, данные начинаю приходить как то... не совсем так как нужно. Скрины предоставлены.

Вопрос:
Что мне сделать, чтобы при чтении, данные приходили нормально, без использования остановок.

1 Скрин - с использованием Thread.Sleep();
2 Скрин - без использования Thread.Sleep();
Миниатюры
Чтение COM - порта   Чтение COM - порта  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.01.2017, 13:28
Ответы с готовыми решениями:

Быстрое чтение COM порта
Здравствуйте. Есть мк, который по com порту передает данные. Например, 110 байт каждые 0.04с. Скорость передачи ~7000байт/с. Требуется их...

Чтение данных с COM порта
Есть два оборудования которые между собой подключены через COM. Одно все время передает данные другому. Хочу данные перехватить. Написал...

Чтение данных с COM-порта
Добрый день. Помогите пожалуйста. Я подаю команду, чтобы поменялись цифры на приборе и нужно чтобы эти цифры отобразились у меня в...

24
Эксперт .NET
 Аватар для Rius
13840 / 7882 / 1706
Регистрация: 25.05.2015
Сообщений: 23,927
Записей в блоге: 14
26.01.2017, 16:27
Студворк — интернет-сервис помощи студентам
Чтение/запись уже выделена в отдельный метод.
Далее можете создать методы более высокого уровня. Всё зависит от Вас.

У меня есть классы запросов, и классы ответов. Создаю запрос (со всеми необходимыми параметрами), передаю в некий метод, который возвращает ответ (с уже разобранными параметрами в виде, удобном для обработки).
Условно:
Code
1
2
3
4
5
6
7
var request = new Measure(Channels.Voltage, Ranges.Max);
var answer = driver.Exchange(request);
 
if (answer) {
  double value = answer.Value;
  Units units = answer.Units;
}
Код привести не могу, да и он слишком сложен.
0
36 / 34 / 20
Регистрация: 17.03.2015
Сообщений: 175
26.01.2017, 21:28  [ТС]
Rius, Неужели нельзя как нибудь просто заменить строку запроса в задаче, в приведенном вами примере?
C#
1
string requestString = "MEAS:VOLT?;";
Добавлено через 4 минуты
Или сделать поток так, чтобы он читал именно тогда, когда в порт возвращается информация.
То есть, например я запускаю поток чтения.
После ввожу что то типа
C#
1
port.Write("MEAS:VOLT?;")
И только тогда он читает ответ.
0
Эксперт .NET
 Аватар для Rius
13840 / 7882 / 1706
Регистрация: 25.05.2015
Сообщений: 23,927
Записей в блоге: 14
26.01.2017, 21:29
Цитата Сообщение от Dragon7788 Посмотреть сообщение
Неужели нельзя как нибудь просто заменить строку запроса в задаче, в приведенном вами примере?
Можно. Просто. Меняйте.

Цитата Сообщение от Dragon7788 Посмотреть сообщение
И только тогда он читает ответ.
Почти так и есть. Ответ надо считать успешно. Только после этого станет известно, что он пришёл.
0
36 / 34 / 20
Регистрация: 17.03.2015
Сообщений: 175
26.01.2017, 21:32  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Можно. Просто. Меняйте.
В том то и дело, когда я просто меняю значение в переменной command, у меня оно меняется, но только почему то 1 раз. А после я показал на скрине как поток читает, каждый раз одну и туже информацию.
0
Эксперт .NET
 Аватар для Rius
13840 / 7882 / 1706
Регистрация: 25.05.2015
Сообщений: 23,927
Записей в блоге: 14
26.01.2017, 21:34
Вынесите указанный код в отдельный метод и его вызывайте с нужной строкой.
Это самые элементарные вопросы программирования.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.01.2017, 21:34

Чтение и проверка троек байт с последовательного порта, serialPort.Read()
Доброго времени суток! Буду рад Вашему совету о дальнейшем направлении разработки. Читаю данные с порта. Нужные данные...

Чтение из com порта
есть устройство посылающее данные в ком порт. нужно их прочитать и сделать запрос на sql сервер. я открываю порт и в таймере читаю функцией...

Чтение из серийного порта
Доброго времени суток! Снова нужна ваша помощь. Надо читать информацию из последовательного порта пока не получим некоторую строку: ...

Чтение COM-порта с заданным периодом
Есть необходимость в режиме реального времени читать данные с порта и выводить на экран. Скорость данных достаточно большая, поэтому если...

Чтение из COM-порта, странная ошибка
Работаю с СОМ-портом, алгоритм обмена следующий : послали команду - подождали 100 мс - посмотрели, что пришло в ответ. В целом все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru