Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/55: Рейтинг темы: голосов - 55, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 01.11.2018
Сообщений: 11

Работа с SerialPort

01.11.2018, 15:26. Показов 11177. Ответов 14

Студворк — интернет-сервис помощи студентам
Коллеги, добрый день!
Есть проблема с работой COM порта. Нижеуказанный код компилируется без ошибок, порт открывает норм, но почему-то ничего не получает(по событию), а при отправлении (по нажатию на кнопку) компилятор выдаёт ошибку что порт закрыт. Но другие программы говорят, что этот порт занят и не могут его использовать. Код не весь, а только то что связано непосредственно с SerialPort:
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
private void comboBox1_Enter(object sender, EventArgs e)    //Перечисление всех COM портов чтобы потов выбрать в ComboBox
        {
            string[] ports = SerialPort.GetPortNames();
            COM_Порт.Items.Clear();
            foreach (string PortName in SerialPort.GetPortNames())
            
            COM_Порт.Items.Add(PortName);
            
            
        }
        //открываем порт, после этого нажатия другие проги не могут использовать этот порт
        private void Отрыть_порт_Click(object sender, EventArgs e)
        {
            try
            {
                SerialPort Serial;
                String name = ((string)COM_Порт.SelectedItem);
//В этой строке "name" и "Битрейт" выбираются из меню, т.е. COM4 и 9600
                Serial = new SerialPort(name, Convert.ToInt16(Битрейт.SelectedItem), Parity.None, 8, StopBits.One);
                Serial.Open();
            }
 
            catch
            {
               MessageBox.Show("Ошибка открытия порта!", "Внимание!");
            }
        }
//Чтение порта по событию, но почему-то пусто(((
        private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string readstring;
            readstring = serial.ReadExisting();
            Сообщения.AppendText(readstring + "\r\n");
        }
 
       //Отправляю небольшой массив в порт, но вылезает ошибка, что порт закрыт((
        private void В_прибор_Click(object sender, EventArgs e)
        {
            byte[] data = { 0, 1, 2, 1, 0 };
            serial.Write(data, 0, data.Length);
        }
    }
Чего я упустил? Ведь используя готовые проекты, найденные на просторах интернета, они работают нормально.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.11.2018, 15:26
Ответы с готовыми решениями:

Работа с последовательным портом с помощью SerialPort
Здравствуйте! помогите кто может! Надо написать программу, которая отслеживала бы одиночное нажатие кнопки подключенной к ком-порту, если...

Работа с компонентом SerialPort. Есть ли у него буфер для хранения принятых данных
Доброго времени суток! Интересует вопрос: на форме имеется компонент SerialPort, который принимает данные до нажатия на кнопку...

Serialport.write и serialport.basestream.write - в чем разница
в чем разница между следующими способами отправки данных на ком-порт?: serPort.BaseStream.Write(data,0,datalen); ...

14
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
01.11.2018, 15:38
Aleksei Bird, не хочу показаться навязчивым...
Вы используете два компонента SerialPort на форме, которые имеют одинаковые настройки всего,
(кроме номера порта разумеется) и эти порты у Вас физически соединены перекрёстным кабелем,
через RS-232 ?
0
0 / 0 / 0
Регистрация: 01.11.2018
Сообщений: 11
01.11.2018, 16:07  [ТС]
ashsvis, на форму я кинул только один компонет SerialPort, обозвал его Serial. В ПК два физических порта в виде переходников USB-COM, да они соединены перекрёстным кабелем.

Добавлено через 4 минуты
ashsvis, хотя похоже вы хотели указать мне на ошибку, но я что-то не могу понять вас
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,562
Записей в блоге: 14
01.11.2018, 16:10
Кинул-то может быть и один. А вот в открытии порта участвует свой, отдельный объект, о котором больше никто не знает за пределами этого метода. И вы его бросаете открытым.
0
0 / 0 / 0
Регистрация: 01.11.2018
Сообщений: 11
01.11.2018, 16:29  [ТС]
хмм, листаю другой код с этим компонентом, не вижу где он указывается иначе, чем у меня. Может уточните
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,562
Записей в блоге: 14
01.11.2018, 16:35
C#
1
2
3
4
5
6
private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  string readstring;
  readstring = serial.ReadExisting(); <<<<<<<<<<<<<<<<<<< этот serial где-то в классе формы объявлен
  Сообщения.AppendText(readstring + "\r\n");
}
C#
1
2
3
4
5
private void Отрыть_порт_Click(object sender, EventArgs e)
{
  try
  {
    SerialPort Serial; <<<<<<<<<<<<<<<<<<<<<< а этот объявлен здесь локально
0
0 / 0 / 0
Регистрация: 01.11.2018
Сообщений: 11
01.11.2018, 17:26  [ТС]
Rius, оказывается в Visual Studio C# имеет значение регистр буквы, т.е. Serial и serial это два разных объекта. Поправил на нижний регистр(как и имя порта на форме) отправлять программа научилась. А вот в событии serial_DataReceived всё также тишина. В коде
C#
1
2
3
4
5
6
 private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string readstring = serial.ReadExisting();
            richTextBox1.AppendText(readstring + "\r\n");
            listBox1.Items.Add(readstring);
        }
я же могу выводит сразу на элементы RichTextBox и ListBox? Или нужна промежуточная переменная?
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,562
Записей в блоге: 14
01.11.2018, 17:30
Цитата Сообщение от Aleksei Bird Посмотреть сообщение
оказывается в Visual Studio C# имеет значение регистр буквы
Внезапно! Да?)))))))))
Цитата Сообщение от Aleksei Bird Посмотреть сообщение
т.е. Serial и serial это два разных объекта
Вообще, вы их дважды определяете в разных блоках, поэтому даже в одном регистре написания это будут 2 разных объекта. Тоже, внезапно!

Цитата Сообщение от Aleksei Bird Посмотреть сообщение
Поправил на нижний регистр
Весь код покажите.
Цитата Сообщение от Aleksei Bird Посмотреть сообщение
я же могу выводит сразу на элементы RichTextBox и ListBox?
Нет, DataReceived вызывается из отдельного потока. А обращение к контролам GUI возможно только из потока GUI.
Примеров по этой теме - Invoke, InvokeRequired, на форуме тонны.
0
0 / 0 / 0
Регистрация: 01.11.2018
Сообщений: 11
01.11.2018, 17:39  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Внезапно! Да?)))))))))
ага, внезапно. В Atmel Studio было не так) Да и Bascom'у пофиг на регистр
Цитата Сообщение от Rius Посмотреть сообщение
Вообще, вы их определяется в разных блоках, поэтому даже в одном регистре написания это будут 2 разных объекта.
Эту ошибку тоже нашёл
Цитата Сообщение от Rius Посмотреть сообщение
Весь код покажите.
это можно, Form2 можно игнорить, она пустая

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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
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 RGB_WIN
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void выходToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //Form1 ГлавноеОкно = new Form1();
 
            Close();
 
 
        }
 
        private void настройкиToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form2 НастройкиОкно = new Form2();
            НастройкиОкно.ShowDialog();
        }
 
        
        //Передача значений ползунка в строку
        private void trackBarR_Scroll(object sender, EventArgs e)
        {
            textBoxR.Text = String.Format("{0:D3}", trackBarR.Value);
        }
 
        private void trackBarG_Scroll(object sender, EventArgs e)
        {
            textBoxG.Text = String.Format("{0:D3}", trackBarG.Value);
        }
 
        private void trackBarB_Scroll(object sender, EventArgs e)
        {
            textBoxB.Text = String.Format("{0:D3}", trackBarB.Value);
        }
 
 
 
        //Проверка на ввод только цифр
        private void textBoxR_KeyPress(object sender, KeyPressEventArgs e)
        {
            char number = e.KeyChar;
 
            if (!Char.IsDigit(number) && e.KeyChar != 8)
            {
                e.Handled = true;
            }
        }
        private void textBoxG_KeyPress(object sender, KeyPressEventArgs e)
        {
            char number = e.KeyChar;
 
            if (!Char.IsDigit(number) && e.KeyChar != 8)
            {
                e.Handled = true;
            }
        }
        private void textBoxB_KeyPress(object sender, KeyPressEventArgs e)
        {
            char number = e.KeyChar;
 
            if (!Char.IsDigit(number) && e.KeyChar != 8)
            {
                e.Handled = true;
            }
        }
        
        
        //Ограничение диапазона ввода
        private void textBoxR_TextChanged(object sender, EventArgs e)
        {
            if (textBoxR.Text == "")
            {
                textBoxR.Text = "0";
            }
            else
            {
                if (Convert.ToInt16(textBoxR.Text) > 255)
                {
                    textBoxR.Text = "255";
                }
            }
            trackBarR.Value = Convert.ToUInt16(textBoxR.Text);
        }
        private void textBoxG_TextChanged(object sender, EventArgs e)
        {
            if (textBoxG.Text == "")
            {
                textBoxG.Text = "0";
            }
            else
            {
                if (Convert.ToInt16(textBoxG.Text) > 255)
                {
                    textBoxG.Text = "255";
                }
            }
            trackBarG.Value = Convert.ToUInt16(textBoxG.Text);
        }
 
        private void textBoxB_TextChanged(object sender, EventArgs e)
        {
            if (textBoxB.Text == "")
            {
                textBoxB.Text = "0";
            }
            else
            {
                if (Convert.ToInt16(textBoxB.Text) > 255)
                {
                    textBoxB.Text = "255";
                }
            }
            trackBarB.Value = Convert.ToUInt16(textBoxB.Text);
        }
 
        private void comboBox1_Enter(object sender, EventArgs e)    //Перечисление всех COM портов
        {
            string[] ports = SerialPort.GetPortNames();
            COM_Порт.Items.Clear();
            foreach (string PortName in SerialPort.GetPortNames())
            
            COM_Порт.Items.Add(PortName);
            //COM_Порт.SelectedIndex = 0; //Вешает прогу, если нет ни одного COM порта
            
        }
        //открываем порт
        private void Отрыть_порт_Click(object sender, EventArgs e)
        {
            try
            {
                //SerialPort Serial;
                String name = ((string)COM_Порт.SelectedItem);
                serial = new SerialPort(name, Convert.ToInt16(Битрейт.SelectedItem), Parity.None, 8, StopBits.One);
                serial.Open();
            }
 
            catch
            {
                MessageBox.Show("Ошибка открытия порта!", "Внимание!");
            }
        }
 
        private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string readstring = serial.ReadExisting();
            Сообщения.AppendText(readstring + "\r\n");
            listBox1.Items.Add(readstring);
        }
             
        private void В_прибор_Click(object sender, EventArgs e)
        {
            byte[] data = { 0, 1, 2, 1, 0 };
            serial.Write(data, 0, data.Length);
        }
    }
}
Цитата Сообщение от Rius Посмотреть сообщение
Нет, DataReceived вызывается из отдельного потока. А обращение к контролам GUI возможно только из потока GUI.
Примеров по этой теме - Invoke, InvokeRequired, на форуме тонны.
спсб, буду изучать ))
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,562
Записей в блоге: 14
01.11.2018, 17:40
Ответы на 7 самых частых вопросов по WinForms
0
0 / 0 / 0
Регистрация: 01.11.2018
Сообщений: 11
02.11.2018, 16:49  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Ответы на 7 самых частых вопросов по WinForms
перелопатил кучу инфы, но всё-равно не могу вывести инфу в listbox, делаю как по ссылке, через делегаты:
вот в начале формы
C#
1
2
3
4
 public partial class Form1 : Form
    {
        string InputData = String.Empty;
        delegate void SetTextCallback(string text);
потом в событии
C#
1
2
3
4
5
6
7
8
public void Serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
        InputData = serial.ReadExisting();
            if (InputData != String.Empty)
            {
                SetText(InputData);
            }
         }
ну и сам вывод
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void SetText(string text)
        {
 
            if (this.listBox1.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                this.AddData(text);
 
            }
        }
А вот если при нажатие на кнопку:
C#
1
2
3
4
5
private void button2_Click(object sender, EventArgs e)
        {
            string readstring = serial.ReadExisting();
            Сообщения.AppendText(readstring + "\r\n");           
        }
Чтение с порта происходит и выводит ровно то, что в него записано. Также работает и в обратную сторону, т.е. записывается в порт:
C#
1
2
3
4
private void В_прибор_Click(object sender, EventArgs e)
        {           
            serial.WriteLine("Hi, my frend");
        }
ЧЯДНТ??
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,562
Записей в блоге: 14
02.11.2018, 17:34
Смотрите.
Вложения
Тип файла: 7z WindowsFormsAlekseiBird.7z (6.6 Кб, 69 просмотров)
1
0 / 0 / 0
Регистрация: 01.11.2018
Сообщений: 11
12.11.2018, 17:23  [ТС]
Rius, спсб за пример!
Проблема оказалась в строке
C#
1
serial = new SerialPort(name, Convert.ToInt16(Битрейт.SelectedItem), Parity.None, 8, StopBits.One);
Visual Studio не ругается, если создаётся объект с именем, который уже есть с таким именем
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,562
Записей в блоге: 14
12.11.2018, 17:26
Это называется область видимости.
В 4 посте ещё говорил ведь. И в 6, и в 8...
1
0 / 0 / 0
Регистрация: 01.11.2018
Сообщений: 11
12.11.2018, 17:37  [ТС]
ну вот так бывает, когда сидишь в только в С для микроконтроллеров, а потом вдруг решаешь что надо написать прогу для компа и думаешь, что С он и в Африке С. А оно не совсем так. В любом случае спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.11.2018, 17:37
Помогаю со студенческими работами здесь

Работа с SerialPort в WPF
sing System; using System.Threading.Tasks; using System.Windows; using System.IO.Ports; namespace КПП { /// &lt;summary&gt; ...

Работа с SerialPort. Странная проблемма
System.Threading.Thread.Sleep(50); //ждем 500мс string indata = port.ReadExisting(); ...

Работа с устройством через SerialPort
Добрый вечер! Есть компьютер и есть внешнее устройство, которые соединены посредством COM порта. Задача: - Отправить данные с...

SerialPort
Добрый день форумчане! Подскажите пожалуйста, используя библиотеку qserialport и команду readline, как мне кажется я считавыю строку...

SerialPort в C#
Ребята помогите с несколькими примерами обработки входящих данных на COM port. просмотрел кучу разных примеров в гугле и так не понял не...


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

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