Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 20.04.2017
Сообщений: 19

Подвисает порт RS232 при отправке данных из кода

03.08.2017, 19:08. Показов 1690. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При отправке в COM через Hercules устройство отвечает нормально, но при отправки через мое приложение порт такое впечатление что подвисает и через тот же Геркулес устройство уже отвечает в формате 3f 3f 3f 3f 3f 3f или же если в окне Геркулес ???????????????. Помогает только удаление порта в дисчпетчере и обновление конфигурации устройств
PORT MONITOR показывает что я посылаю последовательность одинаков как и геркулес почему виснет порт?
C#
1
2
 byte[] data = { 1, 1, 3 };
                 _serialPort.Write(data, 0, data.Length);
Вообще есть ли реальные примеры работы на C# c COM не из MSDN, а из практики с помощью потоков.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.08.2017, 19:08
Ответы с готовыми решениями:

Зависание программы при отправке в com порт
Всем доброго времени суток! Я совсем уж новичок в программировании на c# (до этого писал на delphi). Возникла проблема - программа...

Изменение кодировки при отправке числовых сообщения на com порт
Здравствуйте! При отправке числовых сообщения на com порт выводятся непонятные символы. Пробовал как то перевести на Unicode, Utf-8 и т д,...

При использование нижеписанного кода программа подвисает
procedure TForm6.DBEdit1Change(Sender: TObject); begin if fileExists(extractfilepath(paramstr(0))+'ini\foto\'+dbedit1.Text+'.JPEG')...

3
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.08.2017, 19:24
Цитата Сообщение от Алеск Посмотреть сообщение
есть ли реальные примеры работы на C# c COM не из MSDN, а из практики с помощью потоков.
Лично реализовывал на шарпе с помощью класса SerialPort протокол VDCP для управления эфирной графикой в (почти) реальном времени на телевидении. Все работает, проблем за последние лет 8 не возникало.
Отдельные потоки не создавались, использовалось событие DataReceived, обрабатывалось в том же потоке, в котором возникало: в рабочем потоке пула.

Несколько основных моментов при работе с этим классом:
1. Убедитесь, что настройки вашего порта соответствуют настройкам устройства: скорость передачи, четность и пр.
2. Если используете событие для обработки входящих данных, то установите свойство ReceivedBytesThreshold на небольшое значение. Я в силу специфики протокола ставил на единицу.
3. BytesToRead is a lie. Лучше использовать метод Read и использовать возвращаемое значение как фактически считанное число байт.

В остальном, в общем-то, все зависит от используемого протокола, потому для конкретных примеров было бы неплохо получить ссылочку на спеки сего протокола. Ну и увидеть конкретные вопросы
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.08.2017, 09:36
Цитата Сообщение от Алеск Посмотреть сообщение
есть ли реальные примеры работы на C# c COM не из MSDN
Да сколько угодно. Вот реально работающий класс, из реальной программы (с удалением не относящегося к делу).
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.IO.Ports;
using System.ComponentModel;
using System.Threading.Tasks;
 
 
namespace IndesitTool.Connectors {
    public abstract class Connector : BackgroundWorker {
        /// <summary>
        /// Последовательный порт
        /// </summary>
        protected SerialPort port { get; set; }
 
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="portName">Имя последовательного порта</param>
        public Connector(string portName) {
            this.WorkerReportsProgress = true;
            port = new SerialPort(portName);
        }
 
        /// <summary>
        /// Метод чтения блока данных из устройства
        /// </summary>
        /// <param name="request">Запрос</param>
        /// <param name="bytesToRead">Размер блока чтения</param>
        /// <returns>Ответ</returns>
        /// <param name="requestCount">Количество запросов к устройству перед выходом</param>
        protected byte[] GetResponse(byte[] request, int bytesToRead, int requestCount = 3, int milliseconds = 0) {
            //ВАРИАНТ №1
            //Внешний цикл отправки запроса
            for (int i = 0; i < requestCount; i++) {
                //Очистка буферов порта
                port.DiscardInBuffer();
                port.DiscardOutBuffer();
 
                //Отправка запрос в порт ПОБАЙТНО с задержкой между байтами
                for (int r = 0; r < request.Length; r++) {
                    port.Write(new byte[] { request[r] }, 0, 1);
                    Delay(milliseconds);
                }
                
                //Внутренний цикл ожидания данных в буфере порта
                for (int j = 0; j < 10; j++) {
                    Delay(100);
                    if (port.BytesToRead == bytesToRead) {
                        byte[] response = new byte[bytesToRead];
                        port.Read(response, 0, bytesToRead);
                        return response;
                    }
                }
            }
            return null;
 
            //ВАРИАНТ №2
            //byte[] response = null;
            //for (int i = 0; i < requestCount; i++) {
            //    response = GetResponse(request, bytesToRead).Result;
            //    if (response != null) {
            //        return response;
            //    }
            //}
            //return response;
 
            //ВАРИАНТ №3
            //const int TIMEOUT_START = 100;
            //const int TIMEOUT_END = 1000;
            //byte[] response = null;
            //for (int i = 0; i < requestCount; i++) {
            //    int readed = 0;
            //    response = new byte[bytesToRead];
 
            //    Port.DiscardInBuffer();
            //    Port.DiscardOutBuffer();
            //    Port.ReadTimeout = TIMEOUT_START;
 
            //    try {
            //        Port.Write(request, 0, request.Length);
            //        response[readed++] = (byte)Port.ReadByte();
            //        Port.ReadTimeout = TIMEOUT_END;
 
            //        while (readed != bytesToRead) {
            //            response[readed++] = (byte)Port.ReadByte();
            //        }
            //        return response;
            //    }
            //    catch {
            //        Thread.Sleep(TIMEOUT_END);
            //    }
            //}
            //return null;
        }
 
        /// <summary>
        /// Вспомогательный метод чтения блока данных из устройства
        /// </summary>
        /// <param name="request">Запрос</param>
        /// <param name="bytesToRead">Размер блока чтения</param>
        /// <returns>Ответ</returns>
        private Task<byte[]> GetResponse(byte[] request, int bytesToRead) {
            var tcs = new TaskCompletionSource<byte[]>();
            var timer = new System.Timers.Timer(250) { AutoReset = false };
            port.Write(request, 0, request.Length);
            timer.Elapsed += delegate {
                timer.Dispose();
                try {
                    if (port.BytesToRead == bytesToRead) {
                        byte[] response = new byte[bytesToRead];
                        port.Read(response, 0, bytesToRead);
                        tcs.SetResult(response);
                    }
                    else {
                        tcs.SetResult(null);
                    }
                }
                catch {
                    tcs.SetResult(null);
                }
            };
            timer.Start();
            return tcs.Task;
        }
 
        /// <summary>
        /// Метод организации паузы
        /// </summary>
        /// <param name="milliseconds">Время паузы</param>
        private void Delay(int milliseconds) {
            if (milliseconds == 0) {
                return;
            }
            var re = new ManualResetEvent(false);
            var timer = new System.Timers.Timer(milliseconds) { AutoReset = false };
            timer.Elapsed += delegate {
                timer.Dispose();
                re.Set();
            };
            timer.Start();
            re.WaitOne();
        }
 
        /// <summary>
        /// Абстрактный метод проверки соединения с устройством
        /// </summary>
        /// <returns>Результат проверки соединения</returns>
        protected abstract bool CheckConnection();
 
        /// <summary>
        /// Абстрактный метод конфигурирования последовательного порта 
        /// (переопределяется в наследниках)
        /// </summary>
        protected abstract void ConfigurePort();
    }
}
0
0 / 0 / 0
Регистрация: 20.04.2017
Сообщений: 19
04.08.2017, 10:57  [ТС]
попробуем, напишу результат. Но такого подвисания порта не замечал ни разу, если проблема в настройках, то почему с теми же настройками в Hercules все работает нормально, есть подозрение что что-то после отправки данных не высвобождается и это приводит к зависанию устройства, или же после основной команды бросается в устройство какой-то мусор, после того как в диспетчере удаляю СОМ и восстанавливаю обратно все начинает работать нормально.
Может у кого-то было похожее из практики.
DataReceived уже использовал с другим схожим устройством, все отработало нормально, практика есть использования, но тут зациклился)


Конечно же попробую и вариант insite2012, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.08.2017, 10:57
Помогаю со студенческими работами здесь

Проблема при передаче данных через RS232 - Wi-Fi
Устройство с интерфейсом RS232 подключено через Wi-Fi удлинитель WiBOX...

Перехват и подмена данных при чтении\записи в rs232
Доброго дня, уважаемые. Перерыл, кажется, весь интернет, и так и не нашел ответа на простой вопрос - можно ли перехватывать и МЕНЯТЬ (...

При отправке файла на сайт не выполняется некоторая часть кода
Когда я отправляю mp3 файл на сайт, некоторая часть кода не выполняется if ($_POST ) { print('Идет загрузка...

Ошибки при отправке данных из input в базу данных
Добрый вечер, помогите пожалуйста, при отправке данных из input в форме, вылезают вот такие ошибки Warning: mysqli_query() expects...

Ошибка при отправке данных в бд
Вылезает вот такая ошибка: Warning: Invalid argument supplied for foreach() in D:\OpenServer\domains\chart\index.php on line 186 Я...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru