0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 9
1

Автоопределение COM порта Arduino и его автообновление

08.05.2017, 13:47. Показов 5942. Ответов 3

Author24 — интернет-сервис помощи студентам
Добрый день, имеется макет, которым нужно управлять с компьютера использую COM port с Arduino. Код для Arduino готов он работает, сама визуальная программа готова и тоже работает, но столкнулся с проблемой. При работе с Serial port мы задаем конкретный COM порт (Скажем COM1), а есть вероятность, что Arduino будет подключена не к COM1, а другому, и тут встают задачи:
1) Можно ли реализовать автоопределение COM порта, при подключении Arduino
2) Реализовать обновление подключенных портов (вдруг выдернули и заново вставили USB, чтобы не перезапускать программу, а она сама определила подключение)
Если нельзя сделать первый пункт, то подскажите как вывести в ComboBox список портов и подключать определенный для работы.
Прикладываю код:
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
 
namespace MaketTest
{
    public partial class Form1 : Form
    {
        private SerialPort COMPort;
        public Form1()
        {
            InitializeComponent();
            com();
        }
        private void Form1_FormLoad(object sender, EventArgs e) // это я уже пытался в комбобокс вывести не получилось
        {
            string[] ports = SerialPort.GetPortNames();
            cbPorts.Items.Clear();
            cbPorts.Items.AddRange(ports);
        }
 
        private GroupBox groupBox1;
        private GroupBox groupBox2;
        private GroupBox groupBox3;
        private GroupBox groupBox4;
        private GroupBox groupBox5;
        private Button Fountain;
        private Button Street;
        private Button One_left_room;
        private Button One_one_hall;
        private Button Two_left_room;
        private Button Two_right_room;
        private Button Two_hall;
        private Button Tower;
        private Button Tower_top;
        private Button Tower_bottom;
        private Button Exit;
        private ComboBox cbPorts;
 
        private void InitializeComponent()
        {  } //Свернуто, так как слишком много символов. Но там я не чего не менял.
 
 
        private void com()
        {
            try
            {
                COMPort = new SerialPort();
                COMPort.BaudRate = 9600;
               // COMPort.PortName = "COM4";
                COMPort.Open();
                //
                Street.Enabled = true;
                Fountain.Enabled = true;
                One_left_room.Enabled = true;
                One_one_hall.Enabled = true;
                Two_left_room.Enabled = true;
                Two_hall.Enabled = true;
                Two_right_room.Enabled = true;
                Tower.Enabled = true;
                Tower_bottom.Enabled = true;
                Tower_top.Enabled = true;
            }
            catch
            {
                MessageBox.Show("COM порт не найден");
            }
 
        }
 
        private void Street_Click(object sender, EventArgs e)
        {
            COMPort.WriteLine("1");
        }
 
        private void Fountain_Click(object sender, EventArgs e)
        {
            COMPort.WriteLine("2");
        }
 
        private void One_left_room_Click(object sender, EventArgs e)
        {
            COMPort.WriteLine("3");
        }
 
        private void One_one_hall_Click(object sender, EventArgs e)
        {
            COMPort.WriteLine("4");
        }
 
        private void Two_left_room_Click(object sender, EventArgs e)
        {
            COMPort.WriteLine("5");
        }
 
        private void Two_right_room_Click(object sender, EventArgs e)
        {
            COMPort.WriteLine("6");
        }
 
        private void Two_hall_Click(object sender, EventArgs e)
        {
            COMPort.WriteLine("7");
        }
 
        private void Tower_Click(object sender, EventArgs e)
        {
            COMPort.WriteLine("8");
        }
 
        private void Tower_top_Click(object sender, EventArgs e)
        {
            COMPort.WriteLine("9");
        }
 
        private void Tower_bottom_Click(object sender, EventArgs e)
        {
            COMPort.WriteLine("a");
        }
 
        private void Exit_Click(object sender, EventArgs e)
        {
            try
            {
                COMPort.WriteLine("b");
                COMPort.Close();
                Application.Exit();
            }
            catch
            {
                COMPort.Close();
                Application.Exit();
            }
        }
        private void Form1_ForcClosing (object sender, FormClosedEventArgs e)
        {
            try
            {
                COMPort.WriteLine("b");
                COMPort.Close();
                Application.Exit();
            }
            catch
            {
                COMPort.Close();
                Application.Exit();
            }
        }
    }
}
P.S. Основная проблема что я C++, а работаю в C# в первые, и много не знаю. Помогите пожалуйста!!!! Провел очень много времени за чтением форумов, не дало явных результатов, прощу не отправляйте. Конечно не исключено может я не правильно осуществляю поиск по просторам интернета.
Миниатюры
Автоопределение COM порта Arduino и его автообновление  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2017, 13:47
Ответы с готовыми решениями:

Delphi + Arduino (чтение из порта)
Доброго времени суток ребята. Подскажите, в общем не могу понять почему не идет считывание с порта...

python получение данных с com порта arduino
Добрый вечер, уважаемые программисты. Пытаюсь получить чистые данные с com3 порта от ардуино. На...

Arduino как данные с com порта вывести в веб?
Здравствуйте, уважаемые форумчане! Немного предыстории: сам я не разбираюсь ни в программировании...

Связь Arduino c ПК через USB без виртуального COM порта
Здравствуйте, подскажите пожалуйста может ли Arduino Mega 2560 связываться с ПК по USB не через...

3
Эксперт .NET
10513 / 6440 / 1501
Регистрация: 25.05.2015
Сообщений: 19,547
Записей в блоге: 14
08.05.2017, 14:48 2
Всё, что вы загадали, возможно реализовать. Но знаний нужно больше, чем у вас, либо много упорства.

Определить нужный порт можно как минимум двумя путями.
  • Запустить параллельный опрос всех присутствующих портов, ожидая получения предопределённого ответа. Откуда ожидаемый ответ пришёл, там и находится нужное устройство.
  • Получить через WinAPI все USB-COM порты с заранее известным VID & PID, Serial Number и кастомными строками в дескрипторах USB. Если мост USB-UART подконтрольный и в нём необходимые данные прописаны. Код заковыристее намного, но работает напрямик - чуть быстрее.

Узнать о подключении/отключении устройств можно с помощью WinAPI RegisterDeviceNotification и сопутствующих функций. На форуме есть примеры. Событие при подключении USB

Если открытый в C# SerialPort мост USB-UART будет физически выдернут, программа упадёт. В .Net 2.0 по крайней мере. Есть некоторый код для обхода этой проблемы. Если и когда встретите проблему, сообщите.

А переподключение заново - полностью ваша забота.

Не забывайте про литературу: Литература по C# для начинающих и не только
2
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 9
08.05.2017, 20:46  [ТС] 3
Добрый вечер, можете помочь с RegisterDeviceNotification, приведите приме пожалуйста, желательно билже адаптированный к моему коду....Код претерпел небольшие изменения, сделал чтобы COM отображался в ComboBox...и кнопку подключения пришлось, пока полноценной информации для реализвации автоопределения COM порта (а в частности с Arduino виртуального COM) не нашел, только наброски, отложил на после праздников, поскольку за 3 дня поступило слишком много информации по мало изученному языку, нужно переварить Буду благодарен за помощь

P.S. По PID и VID будет сложнее, поскольку дома тестирую на NANO, а конечный макет будет стоять на UNO, а там кто знает вдруг начальству взбредет поменять вообще на другую Arduino.
Не помню как цитировать правильно но
Запустить параллельный опрос всех присутствующих портов, ожидая получения предопределённого ответа
Т.е. Arduino что-то должна в порт, а на пк приложение его проверяет, и если совпадение, то подключаемся к тому ком порту на котором произошло совпадение, а остальные отсекаем?! Правильно понял идею?!
0
Эксперт .NET
10513 / 6440 / 1501
Регистрация: 25.05.2015
Сообщений: 19,547
Записей в блоге: 14
08.05.2017, 21:21 4
Цитата Сообщение от kto32 Посмотреть сообщение
Т.е. Arduino что-то должна в порт, а на пк приложение его проверяет, и если совпадение, то подключаемся к тому ком порту на котором произошло совпадение, а остальные отсекаем?! Правильно понял идею?!
Программа посылает команду, известную прошивке ардуины, на которую ардуина должна ответить правильно.
Запрос посылается сразу на все доступные порты.
Ответ придёт с тех, где подключена ардуина с нужной прошивкой.

Добавлено через 6 минут
Цитата Сообщение от kto32 Посмотреть сообщение
RegisterDeviceNotification, приведите приме пожалуйста
Список подключенных HID-устройств
С отличием в одном вроде бы методе
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static IntPtr RegisterForUsbEvents(IntPtr hWnd)
        {
            var oInterfaceIn = new DeviceBroadcastInterface();
            oInterfaceIn.Size = (uint)Marshal.SizeOf(oInterfaceIn);
            oInterfaceIn.ClassGuid = GUID_DEVINTERFACE_USB_DEVICE;
            oInterfaceIn.DeviceType = DEVTYP_DEVICEINTERFACE;
            oInterfaceIn.Reserved = 0;
            IntPtr handle = RegisterDeviceNotification(hWnd, oInterfaceIn, DEVICE_NOTIFY_WINDOW_HANDLE);
 
            if (handle == IntPtr.Zero)
            {
                throw new Win32Exception(Marshal.GetLastWin32Error(), "Не удалось подписаться на уведомления о USB");
            }
 
            return handle;
        }
C#
1
2
3
public static readonly Guid GUID_DEVINTERFACE_USB_DEVICE = new Guid("A5DCBF10-6530-11D2-901F-00C04FB951ED");
public const int DEVTYP_DEVICEINTERFACE = 0x05;
public const uint DEVICE_NOTIFY_WINDOW_HANDLE = 0x0;
0
08.05.2017, 21:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2017, 21:21
Помогаю со студенческими работами здесь

Прослушка Serial-порта Arduino средствами VBS/WSH
Всем доброго времени суток !!!-))) Ребят подскажите пожалуйста при помощи какого объекта WSH можно...

Arduino UNO + ESP8266 в мониторе порта в вместо символов иероглифы
Всем привет. Хочу подружить Arduino UNO и ESP 8266. Решил подключить по такой схеме Вроде все...

Arduino nano и его аналоги
Здравствуйте! Задумал я тут сделать авторизацию на компьютер через Ардуинку (эмуляция клавиатуры)....

Наличие на MB реального COM-порта. Как его задействовать?
Добрый день! Сразу скажу, что поиском похожей темы не нашёл... Огромное количество тем про то,...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru