Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
-31 / 2 / 2
Регистрация: 05.09.2018
Сообщений: 184
.NET 4.x

Автоматическое подключение к нужному COM порту

18.01.2023, 12:42. Показов 723. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Пишу программу по автоматическому поиску нужного COM-порта. Устройство общается по определенному протоколу. Кто правильно ответил, тот и наш клиент. Пока сделал проще (без анализа ответного сообщения), какой порт ответил, тот и правильный.

Как работает:
- Запускается таймер, который отвечает за сканирование портов;
- В теле таймера определяется количество доступных портов;
- Поочередно подключается каждый порт, отсылается запрос и проверяется - пришел и ответ.
- По окончанию поиска - таймер отключается.
В целом, поставленную задачу решить получилось, но не оставляет ощущение, что я сделал это самым топорным способом.
Есть ли какая-то возможность оптимизировать автоподключение к COM PORT?

Код прилагаю:
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Web;
 
namespace ComPortAutoConnection
{
    public partial class Form1 : Form
    {
        List<int> ReadBuffer = new List<int>();
        bool ComPortStatus;
        byte ComPortIndex = 0;
        byte[] function_13_data = { 0x0D, 0x00, 0x0D };
        bool TestFlag = false;
 
        int InputDataLength;
        int[] InputData;
        bool InputDataFlag = false;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            
            ScanTimer.Enabled = true;
            ComPortStatus = false;
 
            //ComPort parameters
            serialPort1.BaudRate = 9600;
            serialPort1.DataBits = 8;
            serialPort1.StopBits = StopBits.One;
            serialPort1.Parity = Parity.Odd;
        }
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            Thread.Sleep(15);
            while (serialPort1.BytesToRead > 0)
            {
 
                try
                {
                    ReadBuffer.Add(serialPort1.ReadByte());
 
                }
                catch (Exception error)
                {
                    MessageBox.Show(error.Message);
                }
            }
            InputDataLength = ReadBuffer.Count();
            InputData=new int[InputDataLength];
            InputData = ReadBuffer.ToArray();
            this.Invoke(new EventHandler(DataParsing));
 
        }
 
        private void DataParsing(object sender, EventArgs e)
        {
            tBox.Text += "Пришел ответ";
            String s =String.Join(" ", InputData);
            tBox.Text += s;
            tBox.Text += "\r\n";
            InputDataFlag = true;
          
 
        }
 
        private void ScanTimer_Tick(object sender, EventArgs e)
        {
            
                string[] ports = SerialPort.GetPortNames();
                int AvailablePortNumber = SerialPort.GetPortNames().Length;
 
                tBox.Text = "Кол-во доступных портов: ";
                tBox.Text += string.Format("{0:00}", AvailablePortNumber);
                tBox.Text += "\r\n";
 
                if (AvailablePortNumber != 0)
                {
                    
                    if(InputDataFlag==false)
                    {
                       try
                       {
                           tBox.Text += "Попытка подключения к порту ";
                           tBox.Text += ports[ComPortIndex];
                           serialPort1.PortName = ports[ComPortIndex];
                           serialPort1.Open();
                           tBox.Text += "\r\n";
                           tBox.Text += "Порт подключен";
                           tBox.Text += "\r\n";
                           tBox.Text += "Пошлём запрос по протоколу:";
                           serialPort1.Write(function_13_data, 0, function_13_data.Length);
                           tBox.Text += BitConverter.ToString(function_13_data).Replace("-", " ");
                           tBox.Text += "\r\n";
                           Thread.Sleep(1000);
                       }
                       catch
                       {
                           if (ComPortIndex < AvailablePortNumber) ComPortIndex++;
                           serialPort1.Close();
                       }
                    }       
                    else ScanTimer.Enabled= false; PrBarComPort.Value = 100;
                                    
 
                }
                else tBox.Text = "Достуные порты отсутсвуют";
         
 
            
        }
 
 
    }
}
Буду рад конструктивной критике!
Вложения
Тип файла: rar ComPortAutoConnection.rar (55.7 Кб, 3 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.01.2023, 12:42
Ответы с готовыми решениями:

Автоматическое подключение к com порту
Не получается найти ошибку в проге(не передает com порт) Программа определяет все доступные com порта, далее принимает сигнал и проверяет...

Подключение к нужному порту
Как подключиться к нужному порту, платформа windows phone 8.1 Добавлено через 3 часа 36 минут Скажем альтернативу Socket sock =...

Автоматическое подключение к COm порту при потери связи
Подскажите как реализовать автоматическое подключение к COM порту , если потеряна связь и не идут данные ?

5
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,560
Записей в блоге: 14
18.01.2023, 13:05
Код не смотрел.

Оптимальнее можно.

Если требуется постоянное обновление :
Когда требуется поиск (работа не производится), в фоне должен работать поток/задача. В ней периодически запускается задача поиска, а не в событии таймера.

Далее, неважно, однократно или периодически :
Поиск производится одновременной рассылкой в отдельной задаче по всем портам вашего запроса. Кто правильно ответил - наш клиент.
1
2288 / 1604 / 400
Регистрация: 26.06.2017
Сообщений: 4,757
Записей в блоге: 1
18.01.2023, 13:23
Остаётся только гадать как поведёт себя какое-то стороннее железо, подключенное в соседний СОМ-порт и передающее данные в момент срабатывания таймера.
1
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,560
Записей в блоге: 14
18.01.2023, 13:27
Никак.
Уже открытый порт нельзя открыть снова и что-то туда передать.
Если же какая-то программа открывает порт перед обменом и сразу закрывает после, значит захват связи ей не особо нужен.

А устройства должны непонятные команды игнорировать. Максимум статус ошибки выставят, типа вы мусор прислали - распишитесь.
1
-31 / 2 / 2
Регистрация: 05.09.2018
Сообщений: 184
18.01.2023, 19:11  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Если требуется постоянное обновление :
Когда требуется поиск (работа не производится), в фоне должен работать поток/задача. В ней периодически запускается задача поиска, а не в событии таймера.
Далее, неважно, однократно или периодически :
Поиск производится одновременной рассылкой в отдельной задаче по всем портам вашего запроса. Кто правильно ответил - наш клиент.
Опрашивать нужно до первого совпадения ответных данных с протоколом.

Правильно ли я понял, что для периодического опроса лучше создать класс Task? (https://learn.microsoft.com/ru... ew=net-7.0)
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,560
Записей в блоге: 14
18.01.2023, 19:13
Task LongRunning или Thread.
Без разницы.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.01.2023, 19:13
Помогаю со студенческими работами здесь

Автоматическое переподключение к COM порту
Привет, начал изучать C#, пишу не большую программку, которое будет показывать открыта дверь в комнату или нет, данные о состояние беру с...

Подключение к COM - порту
Добрый день, делаю подключение платы к программе на c#, общение должно происходить по RS-485, по протоколу WAKE. Плата работает...

Подключение сокетом к com-порту
знаю можно сделать такой строкой CreateFile(comPort, GENERIC_WRITE | GENERIC_READ , FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,...

Подключение к ИК-порту через VB
--------- ИК-порт висит на USB, программа для мобилки пишет что это сом3, а в панели управления в модемах пишет что ИК-модем сом4. ...

Подключение кнопки к порту
Есть физический переключатель (1 положение - замкнуто 2 проводка, 2- разомкнуто). Подключаю один провод из этого переключателя к питанию...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru