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

Класс для работы с com портом

07.03.2016, 21:34. Показов 3684. Ответов 7

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

Начинаю работать с с#

есть у кого-нибудь готовый класс для работы с SerialPort: открытие и закрытие порта, чтение приходящих данных, отправка данных в порт. Подкиньте пожалуйста. Спасибо.

В дальнейшем хочу сделать программу для настройки некоего устройства через Com порт по протоколу Modbus (используются только функция3 и функция6, то есть буду считывать данные из регистров устройства и записывать).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.03.2016, 21:34
Ответы с готовыми решениями:

C# класс для работы с COM-портом
подскажите, плз, где можно найти это чудо для .NET Framework 1.0. У MS нашел этот класс в 'C# 100 Samples', но он почему-то не...

терминал для работы с com портом.
Привет. Нужно передать на компьютер большей массив данных (размер массива более 10000 точек переменных типо double). terminal v 1.9b не...

Библиотека для работы с COM портом
Добрый вечер! Пишу программу, которая общается с внешним устройством, через СОМ порт. Я сделал библиотеку, которая прописывает функции...

7
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
07.03.2016, 21:52
Serial Comms in C# for Beginners
1
0 / 0 / 0
Регистрация: 24.01.2016
Сообщений: 25
08.03.2016, 19:31  [ТС]
Спасибо, ViterAlex.

почитал, многое непонятно делигаты и многое другое.

Ребята есть у кого-нибудь готовый класс, работы с ком портом? открытие, закрытие ком порта, чтение и отправка данных в ком порт.

пытался сам сделать, но не получается чтение данных из ком порта, зависает на
C#
1
port.Read(data, 0, data.Length);

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
using System.Windows.Forms;
namespace DGD1
{
    public class Class1
    {
        public static SerialPort Port { get; private set; }
        public interface ISoapXsd { }
        public sealed class SoapHexBinary : ISoapXsd { }
        private int _stepIndex;
        private bool _startRead;
        private const int DataSize = 54;
        private readonly byte[] _bufer = new byte[DataSize];
 
//расчет CRC16 ==========================================================================================================
        public UInt16 ModRTU_CRC(byte[] buf, int len)  //UInt16
        {
            UInt16 crc = 0xFFFF;
 
            for (int pos = 0; pos < len; pos++)
            {
                crc ^= (UInt16)buf[pos];          // XOR byte into least sig. byte of crc
 
                for (int i = 8; i != 0; i--)
                {    // Loop over each bit
                    if ((crc & 0x0001) != 0)
                    {      // If the LSB is set
                        crc >>= 1;                    // Shift right and XOR 0xA001
                        crc ^= 0xA001;
                    }
                    else                            // Else LSB is not set
                        crc >>= 1;                    // Just shift right
                }
            }
            // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
            return crc;
        }
//открыть ==========================================================================================================
        public static void Open(string portName, int PortSpeed)
        {
            SerialPort Port = new SerialPort(portName, PortSpeed, Parity.None, 8, StopBits.One);
            //base.DataReceived += SerialPort_DataReceived;
            Port.Handshake = Handshake.None;
            Port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            Port.Open();
        }
//запрос F3 ==========================================================================================================
        public static void SendFc3(byte address,byte func3, byte start1, byte start2, byte registers1, byte registers2)
        {
            //Ensure port is open:
            if (Port.IsOpen)
            {
                //Clear in/out buffers:
                Port.DiscardOutBuffer();
                Port.DiscardInBuffer();
                //Build outgoing modbus message:
                byte[] message = { address, (byte)3, start1, start2, registers1, registers2};
                Class1 c = new Class1();
                UInt16 crc = c.ModRTU_CRC(message, message.Length);
                byte crc1=(byte)crc;
                 byte[] crc2 = BitConverter.GetBytes(crc >> 8);
                 byte[] messageCRC = { address, (byte)3, start1, start2, registers1, registers2, crc1, crc2[0] };
                //Send modbus message to Serial Port:
                try
                {
                    Port.Write(messageCRC, 0, messageCRC.Length);
 
                    // GetResponse(ref response);
                }
                catch// (Exception err)
                {
                    //modbusStatus = "Error in read event: " + err.Message;
                    // return true;
                }
                //System.Threading.Thread.Sleep(100);
 
                //if (Port.BytesToRead > 0)
                //{
                //    byte[] data = new byte[8];
                //    Port.Read(data, 0, 8);
                //    for (int i = 0; i < data.Count(); i++)
                //        label1.Text += " " + data[i].ToString();
                //}
            }
            else
            {
                //modbusStatus = "Serial port not open";
                // return false;
            }
        } 
    }
}
код уже кучу раз переделывал, уже удалил функцию чтения из порта
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
08.03.2016, 19:53
Цитата Сообщение от dinar1990 Посмотреть сообщение
готовый класс для работы с SerialPort: открытие и закрытие порта, чтение приходящих данных, отправка данных в порт.
Даже если и есть (у меня таких много), то вам это не особо поможет. Поскольку (в большинстве случаев) все привязано к протоколу обмена с портом, и каждый использует тот, что ему нужен.
У вас есть протокол, согласно которому вы хотите обмениваться данными с устройством?
0
0 / 0 / 0
Регистрация: 24.01.2016
Сообщений: 25
08.03.2016, 20:26  [ТС]
insite2012, да - Modbus.

пока ждал ответа, вроде бы разобрался с приемом данных
0
0 / 0 / 0
Регистрация: 24.01.2016
Сообщений: 25
08.03.2016, 21:18  [ТС]
Помогите, не могу найти ошибку.
Открываю порт - все нормально
только пытаюсь отправить данные и возникает ошибка (скриншот во вложении).

Ругается на строчку if (Port.IsOpen) { ..................

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
using System.Windows.Forms;
 
namespace DGD1
{
    public class Class1
    {
        public static SerialPort Port { get; private set; }
        public static byte[] dataRead = new byte[50];
        public static string modbusStatus;
        //расчет CRC16 ========================================
        public UInt16 ModRTU_CRC(byte[] buf, int len)  //UInt16
        {
            UInt16 crc = 0xFFFF;
 
            for (int pos = 0; pos < len; pos++)
            {
                crc ^= (UInt16)buf[pos];          // XOR byte into least sig. byte of crc
 
                for (int i = 8; i != 0; i--)
                {    // Loop over each bit
                    if ((crc & 0x0001) != 0)
                    {      // If the LSB is set
                        crc >>= 1;                    // Shift right and XOR 0xA001
                        crc ^= 0xA001;
                    }
                    else                            // Else LSB is not set
                        crc >>= 1;                    // Just shift right
                }
            }
            // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
            return crc;
        }
 
        //открыть ===============================================
        public static void Open(string portName, int PortSpeed)
        {
            SerialPort Port = new SerialPort(portName, PortSpeed, Parity.None, 8, StopBits.One);
            Port.Handshake = Handshake.None;
            Port.Open();
        }
 
        //запрос F3 =============================================
        public static void SendFc3(byte address,byte func3, byte start1, byte start2, byte registers1, byte registers2)
        {
            //Ensure port is open:
            
                if (Port.IsOpen) 
                {
                    //Clear in/out buffers:
                    Port.DiscardOutBuffer();
                    Port.DiscardInBuffer();
                    //Build outgoing modbus message:
                    byte[] message = { address, (byte)3, start1, start2, registers1, registers2 };
                    Class1 c = new Class1();
                    UInt16 crc = c.ModRTU_CRC(message, message.Length);
                    byte crc1 = (byte)crc;
                    byte[] crc2 = BitConverter.GetBytes(crc >> 8);
                    byte[] messageCRC = { address, (byte)3, start1, start2, registers1, registers2, crc1, crc2[0] };
                    //Send modbus message to Serial Port:
                    try
                    {
                        Port.Write(messageCRC, 0, messageCRC.Length);
 
                        // GetResponse(ref response);
                    }
                    catch// (Exception err)
                    {
                        modbusStatus = "Error in read event";
                        // return true;
                    }
                    System.Threading.Thread.Sleep(100);
 
                    if (Port.BytesToRead > 0)
                    {
                        byte[] data = new byte[50];
                        Port.Read(data, 0, 50);
                        for (int i = 0; i < data.Count(); i++)
                        dataRead[i] = data[i];
                    }
                }
                else
                {
                }
            }
            
        } 
    }
Миниатюры
Класс для работы с com портом  
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
09.03.2016, 16:39
Ваш объект Port существует только в контексте метода Open

C#
1
2
3
4
5
6
public static void Open(string portName, int PortSpeed)
        {
            SerialPort Port = new SerialPort(portName, PortSpeed, Parity.None, 8, StopBits.One); 
            Port.Handshake = Handshake.None;
            Port.Open();
        }
попробуйте так
C#
1
2
3
4
5
6
public static void Open(string portName, int PortSpeed)
        {
            Port = new SerialPort(portName, PortSpeed, Parity.None, 8, StopBits.One); 
            Port.Handshake = Handshake.None;
            Port.Open();
        }
1
0 / 0 / 0
Регистрация: 24.01.2016
Сообщений: 25
11.03.2016, 18:49  [ТС]
спасибо, исправил, помогло
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.03.2016, 18:49
Помогаю со студенческими работами здесь

Не устанавливается компонент для работы с COM-портом
Здравствуйте. Очень нужно программно обратиться к ком порту. Пришлось вспоминать delphi (лет 14 наверное вообще не трогал). Нашел...

Компонент для работы с сom-портом в С++ Builder 4
Здравствуйте. Необходима компонента для работы с сom-портом в С++ Builder 4. Подскажите,пожалуйста, где взять? Заранее спасибо.

Простая программа для работы с СОМ-портом
Уважаемые СПЕЦЫ! Я в Visual С++ полный &quot;0&quot;, и, учитывая возраст и работу, особо вникать не получится, поэтому прошу помочь: существует одна...

Управление LPT портом, что нужно для работы
Как можно управлять LPT какие дрова нужны как ими пользоваться очень много перерыл ничего не работает хочу сделать программу которая будет...

Не получается подцепить Dll для работы с LPT портом
Мне необходимо из Access управлять устройством через LPT порт. Нашел (очень ее хвалят) библиотеку TVicHW32http:...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru