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

Прием данных в COM Port

02.06.2014, 21:59. Показов 10231. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
пытаюсь написать код для принятия данных из Comport компилируется все без ошибок но почемуто обработчик прерываний на прием не срабатывает
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
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 WindowsFormsApplication2
{
   public partial class Power : Form
    {
        SerialPort mySerialPort = new SerialPort("COM8");
        
        public Power()
        {
            InitializeComponent();
           
        }
 
        private void Power_Load(object sender, EventArgs e)
        {
 
        }
         void DataReceivedHandler(
             object sender, 
             SerialDataReceivedEventArgs e)
        {
            //int bytes = port.BytesToRead;
            //byte[] buffer = new byte[bytes];
            //port.Read(buffer, 0, bytes);
            SerialPort sp = (SerialPort)sender;
            string indata = mySerialPort.ReadLine();
            richTextBox2.Text=indata;
        }
 
         private void button1_Click(object sender, EventArgs e)
         {
             mySerialPort.BaudRate = 9600;
             mySerialPort.Parity = Parity.None;
             mySerialPort.StopBits = StopBits.One;
             mySerialPort.DataBits = 8;
             mySerialPort.Handshake = Handshake.None;
 
             mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
             mySerialPort.Open();
             mySerialPort.WriteLine("Press any key to continue...");
 
         }
    }
 
 
   
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.06.2014, 21:59
Ответы с готовыми решениями:

Прием и передача строки Serial Port
Пишу прогу на подобии терминала серийного порта. Встала делема и похожего варианта кода я не нашел, нужно отправлять и принимать строку,...

Прием данных клиентом TcpClient, данных попадается некорректные значения, почему?
Есть сервер на си, который шлет ответ клиенту, вот тестовый кусок: struct recv_packet { int magic; int code; int length; ...

Считывания данных с com-port!
Есть массив данных которые я получаю из ком порта в реальном времени часть данных есть ненужные, а остальные нужно пустить на дальнейшую...

41
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
11.06.2014, 19:24
Студворк — интернет-сервис помощи студентам
C#
1
string indata = new string (buffer[3])
Возможно, так сказать не могу надо попробовать. Но чисто логически правильно.

на счет ошибки - получается массив пустой, поэтому и выдает ошибку. Как вариант - может быть ничего не принимается. Или принимается только один байт, который теряется при обработке. Если не критично терять один пакет, то поставить обработку исключения и должно заработать
0
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 38
11.06.2014, 21:34  [ТС]
то есть в для каждого If нужно делать else {break;} ?
0
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
11.06.2014, 21:44
нее, если массив пустой, то он при любом обращении к несуществующему элементу будет выдавать исключение. Я имел ввиду если можно потерять один пакет, который вызывает ошибку, поставить это условие в блок:
C#
1
2
3
4
5
6
7
8
try
{
//условие с обращением к массиву
}
catch
{
//обработка исключения, можно или бросить или выводить куда-нибудь сообщение
}
0
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 38
11.06.2014, 21:53  [ТС]
раза 4 нормально принимает на 5 раз ошибку бахает мне

Добавлено через 8 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
try
{
if (messByte[0] == 0x05)
            {
                if (messByte[1] == 0x04)
                {
                    if (messByte[3] == 0x01) this.Invoke(new Action(() => { button1.Text = "Реле вкл"; }));
                    else this.Invoke(new Action(() => { button1.Text = "Реле выкл"; }));
 
                }
               
            }
          
 
           
        }
}
catch
{
this.Invoke(new Action(() => { richTextBox2.Text = "Исключение" }));
}
Правильно так должно быть?
0
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
11.06.2014, 22:00
да, попробуй так. Но если это в приеме данных через ком порт и срабатывает событие прихода данных, то в массиве что-то же должно быть, правильно? Вариант с обработкой исключений - уберет ошибку, а не причину ее появления. Попробуй посмотреть что находится в переменной для приема, при возникновении исключения.
0
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 38
11.06.2014, 22:32  [ТС]
странно в буфере всего 1 символ а посылается 4 байта
Миниатюры
Прием данных в COM Port  
0
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
12.06.2014, 21:20
можете привести весь свой код приема данных? Судя по скрину, вы только и принимаете 1 байт...
0
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 38
13.06.2014, 19:24  [ТС]
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
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 WindowsFormsApplication2
{
   public partial class Power : Form
   {
       bool perem1 = true;//переменная датчика света
        SerialPort mySerialPort = new SerialPort("COM2");
        byte[] buffer;
        byte[] rele_on = { 0x05, 0x01, 0x04, 0x00, 0x01, 0x20 };
        byte[] rele_off = { 0x05, 0x01, 0x04, 0x00, 0x00, 0x20 };
        public Power()
        {
            InitializeComponent();
            mySerialPort.Open();
           
        }
 
        private void Power_Load(object sender, EventArgs e)
        {
 
        }
         void DataReceivedHandler(object sender,    SerialDataReceivedEventArgs e)
        { 
             SerialPort sp = (SerialPort)sender;
         
            
           int byteRecieved = mySerialPort.BytesToRead;
            byte[] messByte = new byte[byteRecieved];
               mySerialPort.Read(messByte, 0, byteRecieved);
         
            try
{
if (messByte[0] == 0x05)
            {
                if (messByte[1] == 0x04)
                {
                    if (messByte[3] == 0x01) this.Invoke(new Action(() => { button1.Text = "Реле вкл"; }));
                    else this.Invoke(new Action(() => { button1.Text = "Реле выкл"; }));
 
                }
               
            }
          
 
           
        }
 
catch
{
    this.Invoke(new Action(() => { richTextBox2.Text = "Исключение"; }));
}
 
           // this.Invoke(new Action(() => { richTextBox2.Text = indata; }));
         
         
  
        }
       
 
         private void button1_Click(object sender, EventArgs e)
         {
             mySerialPort.BaudRate = 9600;
             mySerialPort.Parity = Parity.None;
             mySerialPort.StopBits = StopBits.One;
             mySerialPort.DataBits = 8;
             mySerialPort.Handshake = Handshake.None;
 
             mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
             
             if (perem1) { perem1 = false; mySerialPort.Write(rele_off, 0, 6); }
             else { perem1 = true; mySerialPort.Write(rele_on, 0, 6); }
           
         }
 
    }
 
 
   
 
}
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
13.06.2014, 19:53
кингофф, я уже неоднократно в темах говорил, что по моим наблюдениям, последовательный порт-жутко тормозная штука... И в обработчике приема пытаться принять данные не всегда получается (или получается, но в буфере приема не все данные, что ожидаются, а уже таймаут порта вылетает). Я обходил это циклом с проверкой свойства порта BytesToRead. Как только количество байт в буфере было то, что нужно, выход из цикла.
0
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 38
14.06.2014, 00:56  [ТС]
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
void DataReceivedHandler(object sender,    SerialDataReceivedEventArgs e)
        { 
             SerialPort sp = (SerialPort)sender;
         
            
           int byteRecieved = mySerialPort.BytesToRead;
            byte[] messByte = new byte[byteRecieved];
               mySerialPort.Read(messByte, 0, byteRecieved);
         
            try
{
If(byteRecieved==4)//условие проверки количества байт в буфере
{
if (messByte[0] == 0x05)
            {
                if (messByte[1] == 0x04)
                {
                    if (messByte[3] == 0x01) this.Invoke(new Action(() => { button1.Text = "Реле вкл"; }));
                    else this.Invoke(new Action(() => { button1.Text = "Реле выкл"; }));
 
                }
               
            }
          }
 
           
        }
 
catch
{
    this.Invoke(new Action(() => { richTextBox2.Text = "Исключение"; }));
}
 
                    
  
        }
так можно добавить условие проверки количества байт в буфере?
0
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 38
16.06.2014, 11:47  [ТС]
Comport не может же быть таким глюченым, из 5 посылок по 4 байта, 3 посылки бракуются

Добавлено через 27 минут
я взял готовую программу терминал которая в text.box выводила принимаемые данные без всяких ошибок и в обработчике прерывания по приему добавил
C#
1
2
3
4
5
6
7
8
9
10
if (buffer[0] == 0x05)
            {
                if (buffer[1] == 0x04)
                {
                    if (buffer[3] == 0x01) this.Invoke(new Action(() => { button1.Text = "Реле вкл"; }));
                    else this.Invoke(new Action(() => { button1.Text = "Реле выкл"; }));
 
                }
               
            }
после запуска 2-3 посылки обрабатывает как надо. на 4 уже вылетает ошибка
0
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
16.06.2014, 12:09
посмотрите сторонними программами, что передает устройство. Может оно через несколько посылок отправляет еще что-то. Как вариант программа Putty
0
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 38
16.06.2014, 12:22  [ТС]
я параллейно подцепил еще один приемник pl2303 и программой терминал смотрю что идет. контроллер посылает стабильно 4 байта.
0
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
16.06.2014, 12:42
тогда вариант смотреть сколько пришло в буфер, если меньше 4 - пропускать
0
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 38
16.06.2014, 12:50  [ТС]
странно почему их пропускает. программа терминал нормально все выводит без единой потери а эта раз через раз
0
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
16.06.2014, 12:56
угу, странно. У меня вот, при отрисовке графика 4 ядра на 80% грузит, тоже очень странно ))
Но все равно при любой передачи желательно проверять, то ли прислали, что предполагалось... иначе могут запустить программу с другим устройством и она вместо того, что бы сообщить, что устройство не правильное вылетит или повиснет. Но это мое мнение. Если это программа именно для вас, то поставить только проверку количества принятых байтов и норм.
0
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 38
16.06.2014, 12:58  [ТС]
а контроллер то один раз посылает пакет он потеряется и все. будет написанно что реле выкл а на самом деле оно включится
0
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
16.06.2014, 15:08
сложно что-то сказать в данном случае, т.к. именно ком порт не может сам потерять 3 байта и оставить один... это разве что в буфер не поместилось. а прошивка МК у Вас есть? может все-таки отправляет иногда 1 байт? Или посмотрите, что в этом байте, может он вообще рендомный... и не реагирует он на реле
0
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 38
16.06.2014, 15:21  [ТС]
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
if(PINC.2==0)//если нажата кнопка
{
delay_ms(100);//антидребезг
while(PINC.2==0){}//продолжим когда отпустим кнопку
 
if(a)//реле включено
{     
putchar(0x05);
putchar(0x04);
putchar(0x00);
putchar(0x01);
 
a=0;
}
else//реле выключено
{
putchar(0x05);
putchar(0x04);
putchar(0x00);
putchar(0x00);
 
a=1;
}      
}
по нажатию кнопки чередуются пакеты, чтобы в forme имя кнопки менялось Вкл или Выкл
0
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
16.06.2014, 15:35
ага, а первые два пакета - постоянные? если да, то можно по ним и смотреть реальная ли это посылка
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.06.2014, 15:35

Асинхронные сокеты: Как организовать разделение на прием сообщений и прием файлов
Изучив синхронные сокеты, перешел к изучению асинхронных. Столкнулся вот с чем, как, используя асинхронные сокеты, сделать на стороне...

Прием по COM HEX данных
Как мне принять данные в 16 ричной форме по COM порту _serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); ...

TelegramBot прием данных с Inline
Ребят, если не сложно, можете дать какую-то ссылочку (my english is very bad) или написать тут: как можно реализовать приём данных с...

Прием данных с СОМ-порта
В общем надо мне написать программу для передачи и приема хотя бы текста через последовательный порт. Нашел пару исходников программ в...

Прием и передача данных на одном порту
Всем Доброго времени суток. Где то слышал что возможно так что бы данные отправлялись и принимались на одном и том же порту. Что то...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru