Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 17.01.2024
Сообщений: 53

Программа зависает при попытке записи в COM порт

22.04.2024, 18:10. Показов 1363. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
            portnames = SerialPort.GetPortNames();
            comboBox1.Items.AddRange(portnames);
            if (comboBox1.SelectedValue != comboBox1.Text) // проверка, есть ли уже такой пункт в comboBox(нас это не интересует)
            {
                comboBox1.Items.Clear();
                comboBox1.Items.AddRange(portnames);
            }
            try
            {
                serialPort1.PortName = comboBox1.Text;
                serialPort1.Open();
                label3.Text = percents.ToString();
                serialPort1.Write(Convert.ToString(percents)); // вот здесь мы обламываемся
                label2.Text = "Порт выбран" + i;
                i++; // счетчик удачных попыток записать что-либо
                serialPort1.Close();
 
            }
            catch
            {
                label2.Text = "Такой порт не найден";
                i = 0;
            }
Программа успевает записать два раза в сериал порт(причем я вижу что светодиод RX, который показывает пришедшие на нем сигналы мигает два раза, а мой "счётчик" показывает один раз) а потом виснет если я не отключу устройство (ардуино leonardo). Самое что интересное с какой-нибудь ардуино Nano все работает превосходно - ничего не виснет. мое предположение - ардуино leonardo является HID устройством и может имитировать клавиатуру и поэтому не дружит с моей программкой. Но это может быть не так. Я уже и пустой скетч загружал - ничего не помогло.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.04.2024, 18:10
Ответы с готовыми решениями:

Зависает программа при попытке сохранить результат
Всем привет. В своём проекте использую Microsoft.Office.Interop.Excel. Процесс открытия документа проходит успешно. ...

Программа намертво зависает при попытке ввода данных
Ребята, прошу помощи. Проблема в том, что программа намертво зависает при попытке ввода данных. Помогите найти ошибку, пожалуйстааа! ...

При попытке вывести форму по таймеру программа зависает
Реальное приложение должно мониторить систему по таймеру и при выполнении некоторого условия выводить форму. Таймер создает события,...

25
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3421 / 2740 / 575
Регистрация: 04.09.2018
Сообщений: 8,608
Записей в блоге: 3
22.04.2024, 18:18
TIP_CHACK, ну что-то очень плохо у тебя пока с логикой взаимодействия.
Ты же сам после отправки одной посылки закрываешь порт. Плюс ко всему, Ардуины очень любят перезагружаться после подключения к ним через их COM-порт - от сюда она может "мигнуть" лишний раз. Это вовсе не означает что там что-то принято было.
В целом, твой код вообще ... ни о чем. Так не работают с этим.
1
1 / 1 / 0
Регистрация: 17.01.2024
Сообщений: 53
22.04.2024, 18:31  [ТС]
то есть ты хочешь сказать что при открытии или же закрытии порта какой-то сигнал посылается ардуинке?

Добавлено через 50 секунд
ну... возможно да в этом дело, но почему тогда с другой ардуиной все прекрасно работает?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3421 / 2740 / 575
Регистрация: 04.09.2018
Сообщений: 8,608
Записей в блоге: 3
22.04.2024, 18:36
TIP_CHACK, ардуина-ардуине рознь.
Цитата Сообщение от TIP_CHACK Посмотреть сообщение
все прекрасно работает
ни о чем не говорит. По твоему стилю написания программ можно косвенно судить о твоем возможно неверном восприятии этого "прекрасного".
Цитата Сообщение от TIP_CHACK Посмотреть сообщение
какой-то сигнал посылается ардуинке?
Ничего не посылается: в ардуинах стоит преобразователь типа CH340, который, видя что к нему кто-то присосался - перезагружает плату. Т.е. после установки соединения с ней, не надо тут же чего-то слать, надо выждать секунды 2-3.
0
1 / 1 / 0
Регистрация: 17.01.2024
Сообщений: 53
22.04.2024, 18:42  [ТС]
ну про 2-3 секунды это я знаю, но я не уверен что если я закрою порт это разценится платой как разрыв соединения.
Цитата Сообщение от wizard41 Посмотреть сообщение
ни о чем не говорит. По твоему стилю написания программ можно косвенно судить о твоем возможно неверном восприятии этого "прекрасного".
ну почему же. с платой leonardo программа виснет, c nano не виснет.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3421 / 2740 / 575
Регистрация: 04.09.2018
Сообщений: 8,608
Записей в блоге: 3
22.04.2024, 18:49
Цитата Сообщение от TIP_CHACK Посмотреть сообщение
с платой leonardo программа виснет
что значит "виснет"? Ничего не виснет - просто нет обмена.
Цитата Сообщение от TIP_CHACK Посмотреть сообщение
c nano не виснет
у Nano вроде драйвер другой, точно не помню.

Короче, сделай еще одну кнопку для закрытия порта. Не закрывай его сразу же после передачи. Передавай и смотри что получает дурина.

Добавлено через 2 минуты
Цитата Сообщение от TIP_CHACK Посмотреть сообщение
if (comboBox1.SelectedValue != comboBox1.Text)
Что проверяет эта конструкция?
0
1 / 1 / 0
Регистрация: 17.01.2024
Сообщений: 53
22.04.2024, 18:53  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Сообщение от TIP_CHACK
все прекрасно работает
ни о чем не говорит. По твоему стилю написания программ можно косвенно судить о твоем возможно неверном восприятии этого "прекрасного".
ну почему же. c Leonardo программа виснет, c nano нет.
Цитата Сообщение от wizard41 Посмотреть сообщение
Ничего не посылается: в ардуинах стоит преобразователь типа CH340, который, видя что к нему кто-то присосался - перезагружает плату. Т.е. после установки соединения с ней, не надо тут же чего-то слать, надо выждать секунды 2-3.
вот я только что написал прогу которая то открывает, то закрывает порт. ардуинка никак не реагирует на открытие и закрытие порта(по крайней мере не мигает), единственное, если я выберу ее порт, она мигнет. В общем темная темя какая-то
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3421 / 2740 / 575
Регистрация: 04.09.2018
Сообщений: 8,608
Записей в блоге: 3
22.04.2024, 18:56
Цитата Сообщение от TIP_CHACK Посмотреть сообщение
если я выберу ее порт, она мигнет, но не пин RX
я только что про это говорил. Чет, ты вообще не в теме, похоже...
0
1 / 1 / 0
Регистрация: 17.01.2024
Сообщений: 53
22.04.2024, 19:01  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
что значит "виснет"? Ничего не виснет - просто нет обмена.
нет она прям виснет. я не могу подвинуть окно с программой, но если, как я уже сказал, отсоединю то она отвиснет и переместится туда, куда я ее пытался перетащить.
Цитата Сообщение от wizard41 Посмотреть сообщение
Что проверяет эта конструкция?
вот я после того, как создал тему, понял что ничего и убрал ее
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3421 / 2740 / 575
Регистрация: 04.09.2018
Сообщений: 8,608
Записей в блоге: 3
22.04.2024, 19:14
Цитата Сообщение от TIP_CHACK Посмотреть сообщение
нет она прям виснет. я не могу подвинуть окно с программой, но если, как я уже сказал, отсоединю то она отвиснет и переместится туда, куда я ее пытался перетащить.
Мдя. Странности какие-то.

Ладно, а обратная связь от дурины есть? Как ты отслеживаешь что она приняла по порту?
Передать можно что угодно и куда угодно - светодиод RX будет моргать всегда.
0
1 / 1 / 0
Регистрация: 17.01.2024
Сообщений: 53
22.04.2024, 19:25  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Ладно, а обратная связь от дурины есть? Как ты отслеживаешь что она приняла по порту?
Передать можно что угодно и куда угодно - светодиод RX будет моргать всегда.
я пока не парсил то что приходит ардуине, но как вы мне сказали написал прогу с кнопками с закрытием и открытием порта:
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
 public partial class Form1 : Form
    {
        bool SO = false;
    string [] portnames = System.IO.Ports.SerialPort.GetPortNames();
 
        public Form1()
        {
            InitializeComponent();
            timer2.Start();
            comboBox1.Items.AddRange(portnames);
            if(comboBox1.Items.Count != 0)
            {
                comboBox1.SelectedIndex = 0;
            }
            
        }
 
 
        private void timer2_Tick(object sender, EventArgs e)
        {
            if (SO == false)
            {
                portnames = System.IO.Ports.SerialPort.GetPortNames();
                serialPort1.PortName = comboBox1.Text;
            }
 
            label2.Text = comboBox1.Text.ToString();
            comboBox1.Items.Clear();
            comboBox1.Items.AddRange(portnames);
 
            
 
        }
 
 
 
        private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.Open();
            SO = true;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            SO = false;
        }
    }
и оказывается....... ДА реакция всё такие есть(я в душе не чаю почему это до этого не работало а теперь заработало но ладно) вот только, что теперь?

Добавлено через 4 минуты
теперь я добавил отправку по кнопке сообщения:
C#
1
2
3
4
        private void button3_Click(object sender, EventArgs e)
        {
            serialPort1.Write("xnjskjdjha");
        }
ииииииииииииии да, все снова виснет, и теперь никаких миганий после открытия порта, а значит и не приходит ничего (хотя судя по всему это тоже нельзя утверждать)
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3421 / 2740 / 575
Регистрация: 04.09.2018
Сообщений: 8,608
Записей в блоге: 3
22.04.2024, 19:26
Цитата Сообщение от TIP_CHACK Посмотреть сообщение
вот только, что теперь?
в зависимости от того, какой замысел был изначально.
Попробуй сделать эхо от дурины, т.е. что она получила - пусть отфутболивает назад. На ПК посмотришь ответ...

Добавлено через 1 минуту
Цитата Сообщение от TIP_CHACK Посмотреть сообщение
private void timer2_Tick(object sender, EventArgs e)
        {
            if (SO == false)
            {
                portnames = System.IO.Ports.SerialPort.GetPortNames( );
                serialPort1.PortName = comboBox1.Text;
            }
label2.Text = comboBox1.Text.ToString();
            comboBox1.Items.Clear();
            comboBox1.Items.AddRange(portnames);
}
А вот это нафига тут? И, самое смешное, что этот таймер делает?
0
1 / 1 / 0
Регистрация: 17.01.2024
Сообщений: 53
22.04.2024, 19:36  [ТС]
это огрызки от предыдущего проекта(у меня есть проект, с говорящим именем TEST, и там я тестирую всякое, вот и остались остатки) все это работает при условии что ардуина подключена ДО запуска
кстати, как оказалось nano реагирует на открытие порта только после подключения, если я его открою и закрою, а потом снова открою, не отсоединяя ардуинку, визуальной реакции не будет. Что не сказать про Leonardo, она при таких действиях каждый раз будет моргать(и при открытии и при закрытии)
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3421 / 2740 / 575
Регистрация: 04.09.2018
Сообщений: 8,608
Записей в блоге: 3
22.04.2024, 19:41
Цитата Сообщение от TIP_CHACK Посмотреть сообщение
что ардуина подключена ДО запуска
Понятно.
В нормальном проекте она должна работать и ДО, и ПОСЛЕ и ВОВРЕМЯ...
0
1 / 1 / 0
Регистрация: 17.01.2024
Сообщений: 53
22.04.2024, 19:48  [ТС]
я начинаю путаться в собственной программе... да уж надо будет этого Франкенштейна переписать как только с проблемой разберусь

Добавлено через 1 минуту
Цитата Сообщение от TIP_CHACK Посмотреть сообщение
я пока не парсил то что приходит ардуине, но как вы мне сказали написал прогу с кнопками с закрытием и открытием порта:
C#Выделить код
 public partial class Form1 : Form
    {
        bool SO = false;
    string [] portnames = System.IO.Ports.SerialPort.GetPortNames( );
public Form1()
        {
            InitializeComponent();
            timer2.Start();
            comboBox1.Items.AddRange(portnames);
            if(comboBox1.Items.Count != 0)
            {
                comboBox1.SelectedIndex = 0;
            }
}
private void timer2_Tick(object sender, EventArgs e)
        {
            if (SO == false)
            {
                portnames = System.IO.Ports.SerialPort.GetPortNames( );
                serialPort1.PortName = comboBox1.Text;
            }
label2.Text = comboBox1.Text.ToString();
            comboBox1.Items.Clear();
            comboBox1.Items.AddRange(portnames);
}
private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.Open();
            SO = true;
        }
private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            SO = false;
        }
    }
и оказывается....... ДА реакция всё такие есть(я в душе не чаю почему это до этого не работало а теперь заработало но ладно) вот только, что теперь?
вот это я открыл проект TEST, а все до этого был основной проект(поэтому все кустарно плохо и несуразно)

Добавлено через 4 минуты
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
    public partial class Form1 : Form
    {
        bool SO = false;
    string [] portnames = System.IO.Ports.SerialPort.GetPortNames();
 
        public Form1()
        {
            InitializeComponent();
            timer2.Start();
            comboBox1.Items.AddRange(portnames);
            if(comboBox1.Items.Count != 0)
            {
                comboBox1.SelectedIndex = 0;
            }
            
        }
 
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
 
        }
 
        private void timer2_Tick(object sender, EventArgs e)
        {
            if (SO == false)
            {
                try
                {
                    portnames = System.IO.Ports.SerialPort.GetPortNames();
                    serialPort1.PortName = comboBox1.Text;
                    portnames = System.IO.Ports.SerialPort.GetPortNames();
                }
                catch
                {
 
                }
            }
            label2.Text = comboBox1.Text.ToString();
            comboBox1.Items.Clear();
            comboBox1.Items.AddRange(portnames);
        }
 
        private void label2_Click(object sender, EventArgs e)
        {
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            if(SO == false)
            {
                serialPort1.Open();
                SO = true;
            }
 
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            SO = false;
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            if (SO == true)
            {
                serialPort1.Write("xnjskjdjha");
            }
 
        }
    }
вот НОРМАЛЬНЫЙ тестовый проект, который работает ДО, ПОСЛЕ и ВОВРЕМЯ
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3421 / 2740 / 575
Регистрация: 04.09.2018
Сообщений: 8,608
Записей в блоге: 3
22.04.2024, 19:50
TIP_CHACK, так не торопись - спокойно, по очереди, шаг за шагом...
Сделай сперва нормальное подключение/отключение. Нормальный выбор доступного COM-порта...
Предусмотри "нештатные" ситуации, чтобы ничего не висло, если вдруг порт отвалится... И все такое...
0
1 / 1 / 0
Регистрация: 17.01.2024
Сообщений: 53
22.04.2024, 20:05  [ТС]
ну поскольку это тестовый проект, можно сделать особо и без проверок, кустарненько немного.
но если так надо то вот изменённая 3-тья кнопка:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        private void button3_Click(object sender, EventArgs e)
        {
            if (SO == true)
            {
                try
                {
                    serialPort1.Write("xnjskjdjha");
                }
                catch
                {
 
                }
 
            }
 
        }
Добавлено через 11 минут
Опа! еще прикол заметил: есть программка такая, OpenHarwiredMonitor(Serial Edition), и принцип у нее такой же, до некоторого времени она у меня не работала, но теперь вдруг(я честно не знаю как) очнулась. Подключаю к nano - мигает RX, подключаю к leonardo - И ТУТ ВСЁ ТОЖЕ ВСТАЛО!
Походу, дело не в коде, верней, не в его корявости
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3421 / 2740 / 575
Регистрация: 04.09.2018
Сообщений: 8,608
Записей в блоге: 3
22.04.2024, 21:17
TIP_CHACK, держи для изучения:

Отправка в ардуину -> нажать Enter в текстовом блоке Send To.
В ардуине ответ сам сделаешь (наверное).
Вложения
Тип файла: 7z ComEchoSample.WF.7z (2.33 Мб, 2 просмотров)
1
1 / 1 / 0
Регистрация: 17.01.2024
Сообщений: 53
22.04.2024, 21:34  [ТС]
Спасибо за программу, но почему то когда я законекчусь и отошлю второй раз сообщение то все ломается

Добавлено через 55 секунд
приходится отключатся и подключатся заново

Добавлено через 1 минуту
а... ну это происходит только с, будь она неладна, ардуино леонардо, с нанкой все прекрасно
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3421 / 2740 / 575
Регистрация: 04.09.2018
Сообщений: 8,608
Записей в блоге: 3
22.04.2024, 21:37
Цитата Сообщение от TIP_CHACK Посмотреть сообщение
то все ломается
ну тут сложно сказать что происходит. Если ардуина сама ничего не передает непрерывно в ответ, то надо смотреть что происходит с портом на ПК в этот момент.
Ставить точки останова и дебажить.

Добавлено через 56 секунд
Цитата Сообщение от TIP_CHACK Посмотреть сообщение
с, будь она неладна, ардуино леонардо
скетч в ней какой? Не может она верещать в обратку постоянно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.04.2024, 21:37
Помогаю со студенческими работами здесь

[Ubuntu] При попытке сделать SaveToFile зависает программа
При попытке выполнить следующий код выполнение программы тупо зависает: synmemo1.Lines.SaveToFile('/home/kirill/lox.py'); Пытался...

Зависает программа при попытке чтения строки из listbox`a
LPCTSTR dir = L""; int SelectedIndex = SendMessage(hDirsList, LB_GETCURSEL, 0, 0); SendMessage(hDirsList, LB_GETTEXT,...

Программа зависает при приеме сообщения через com порт
создал один виртуальный порт.Написал программу для чтения и записи по этому порту, но при приёме текста, всё зависает. думаю ошибка...

DirectX.AudioVideoPlayback: при попытке запустить видео программа зависает
Подключил using Microsoft.DirectX; using Microsoft.DirectX.AudioVideoPlayback; При попытке запустить видео программа тупо зависает,...

Xerox WorkCentre 3550. При попытке напечатать текст (без разницы какая программа) программа из которой идет печать зависает. Картинки печатаются норм.
Вот такая вот байда. Кто сталкивался? Подскажите где тут собака зарыта :) з.ы. никогда не покупайте данный принтер. С ним одни проблемы...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в 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