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

COM порт - получение данных

01.02.2015, 23:42. Показов 5548. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно задача такая: для начало нужно получить любые данные с com порта с прибора.
Есть код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
ComPort.PortName = Convert.ToString(cboPorts.Text);
                ComPort.BaudRate = Convert.ToInt32(cboBaudRate.Text);
                ComPort.DataBits = Convert.ToInt16(cboDataBits.Text);
                ComPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cboStopBits.Text);
                ComPort.Handshake = (Handshake)Enum.Parse(typeof(Handshake), cboHandShaking.Text);
                ComPort.Parity = (Parity)Enum.Parse(typeof(Parity), cboParity.Text);
ComPort.Open();
             Thread.Sleep(500);
            int byteRecieved = ComPort.BytesToRead;
            byte[] messByte = new byte[byteRecieved];
            ComPort.Read(messByte, 0, byteRecieved);
            ComPort.Close();
Свойства для открытия порта ставятся динамически. Вопрос в том почему пустой массив байтов messByte?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.02.2015, 23:42
Ответы с готовыми решениями:

Получение данных входящих на порт
Хочу написать программу, которая будет выводить на экран все, что приходит на определенный порт. Может кто-нибудь помочь ссылкой, кодом,...

Получение и передача данных через COM порт
Добрый день Мне кажется, я изобретаю велосипед и должно быть полно примеров такого кода. Но ничего найти не удалось. Суть:...

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

51
1 / 1 / 0
Регистрация: 01.02.2015
Сообщений: 35
03.02.2015, 13:10  [ТС]
Студворк — интернет-сервис помощи студентам
А реализация протокола на с++ полностью не отражает что там должно быть?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.02.2015, 13:14
Цитата Сообщение от сеня2007 Посмотреть сообщение
реализация протокола на с++
К сожалению, я в плюсах не силен. Да и там реализация какая-то непонятная, один участок (по подсчету CRC) постоянно повторяется... Непонятно, что его в метод не вынесли...
0
1 / 1 / 0
Регистрация: 01.02.2015
Сообщений: 35
03.02.2015, 13:21  [ТС]
Вот смотрите вроде бы нужно отправить первым байтом старт бит, потом адресс устройства,потом указываем количество байт данных равных 0 => соответсвенно ничего передавать не нужно в виде данных, потом команду пакета и как стоп бит используем чек сумму. Как это реализовать? Получать данные практически аналогично только указываем в количестве байт 2 и получаем собственно эти 2 байта. Мне нужно это реализовать. Как?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.02.2015, 13:31
Протокол давай.
0
1 / 1 / 0
Регистрация: 01.02.2015
Сообщений: 35
03.02.2015, 13:33  [ТС]
Я скидывал больше мне ничего не дают говорят нет ничего.

Добавлено через 1 минуту
Мне то не жалко. Мне бы быстрей разобраться. так что смысла что то утаивать нет.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.02.2015, 13:33
...это ваши проблемы. Просите полную версию.
0
1 / 1 / 0
Регистрация: 01.02.2015
Сообщений: 35
03.02.2015, 13:34  [ТС]
Зачем еще что там? Там в этой версии все описано. Скажите что вам нужно? Как запрос составить есть, что принимает есть. Что еще должно быть?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.02.2015, 13:35
сеня2007, я сделаю пример, но сразу предупреждаю, далеко не факт, что он заработает, поскольку протокол не известен до конца. Ждите.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.02.2015, 13:44
Скажите что вам нужно?
пост #26.
0
1 / 1 / 0
Регистрация: 01.02.2015
Сообщений: 35
03.02.2015, 16:27  [ТС]
Что там с примером?

Добавлено через 2 минуты
Сейчас прислали ответ с тем что не дадут полный протокол, потому что не нужен.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.02.2015, 16:46
сеня2007,

ну тогда попивайте чай и читайте хабр, а на задачу забивайте. "Передать данные по протоколу, а мы его тебе не дадим" это просто занавес.
1
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.02.2015, 16:49
TC, кому не нужен, им или вам?

Т.е. вам лично достаточно реализации двух методов "АЦП для текущего уровня сигнала" и "текущего и среднего уровня сигнала"? А все остальные внештатные ситуации, служебная информация и диагностика не нужны?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.02.2015, 18:02
сеня2007, вот вам пример. Предупреждаю, это ТЕСТОВЫЙ пример, поскольку мне так и не ясен до конца алгоритм. Именно поэтому тут стоит количество считываемых байт количеству отправленных. Для проверки повесте на порт перемычку по RxD, TxD, должен быть прием того же пакета, что был отправлен.
Ну а дальше - к тем кто задал вам задачу, за полным описанием протокола.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Threading;
using System.IO.Ports;
using System.ComponentModel;
 
namespace COMPort_Example {
    class Program {
        static void Main(string[] args) {
            PortListner listner = new PortListner("COM1");
            listner.RunWorkerCompleted += new RunWorkerCompletedEventHandler(listner_RunWorkerCompleted);
            listner.RunWorkerAsync();
            Console.ReadLine();
        }
 
        static void listner_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
            if (e.Error != null) {
                Console.WriteLine(e.Error.Message);
                return;
            }
            if (e.Result == null) {
                Console.WriteLine("Device not answered!");
            }
            else {
                Console.WriteLine("Answer from device: {0}", (string)(e.Result));
            }
        }
    }
    class PortListner : BackgroundWorker {
        private SerialPort port;
 
        public PortListner(string portName) {
            port = new SerialPort(portName, 9600);
        }
        protected override void OnDoWork(DoWorkEventArgs e) {
            byte[] ascFromMaster = { 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00 };
                                   //SB    ADDR  NBB   CMD   Dx    CHKS
            ascFromMaster[5] = GetCHSum(ascFromMaster);
            int readSize = 6;
            port.Open();
 
            for (int i = 0; i < 5; i++) {
                List<byte> dataFromSlave = new List<byte>();
                if (ReadBlock(ascFromMaster, dataFromSlave, readSize)) {
                    string answer = BitConverter.ToString(dataFromSlave.ToArray());
                    e.Result = answer;
                    return;
                }
                else {
                    Thread.Sleep(500);
                }
            }
            e.Result = null;
        }
        private bool ReadBlock(byte[] dataToWrite, List<byte> dataToRead, int readSize) {
            for (int i = 0; i < 10; i++) {
                port.DiscardInBuffer();
                port.Write(dataToWrite, 0, dataToWrite.Length);
                int index = 0;
                while (index < 10) {
                    if (port.BytesToRead == readSize) {
                        for (int j = 0; j < readSize; j++) {
                            dataToRead.Add((byte)(port.ReadByte()));
                        }
                        return true;
                    }
                    else {
                        Thread.Sleep(10);
                    }
                    index++;
                }
            }
            return false;
        }
        private byte GetCHSum(byte[] data) {
            byte temp_1 = (byte)(data.Sum(b => b) & 0xf);
            byte temp_2 = (byte)(data.Sum(b => b >> 4) << 4);
            return (byte)(temp_1 | temp_2);
        }
    }
}
1
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.02.2015, 18:24
...также запустите параллельно Portmon https://technet.microsoft.com/... 96644.aspx и приложите полный дамп обмена запрос-ответ в txt-файле в HEX отображении на форум. Поглядим соответствие протоколу.
0
1 / 1 / 0
Регистрация: 01.02.2015
Сообщений: 35
04.02.2015, 00:32  [ТС]
Я немного изменил входные параметры чтобы они соответсвовали:
C#
1
2
3
4
port = new SerialPort(portName, 4800);
byte[] ascFromMaster = { 0xb5, 1, 0x00, 0x29, 0x00 };
                                   //SB    ADDR  NBB   CMD   Dx    CHKS
            ascFromMaster[4] = GetCHSum(ascFromMaster);
Теперь возникает ошибка:
операция ввода вывода была прервана из-за завершения потока команд
и ссылается на эту строку: port.Write(dataToWrite, 0, dataToWrite.Length);
Что там может быть не правильное? Вроде бы все выставил как надо
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.02.2015, 00:36
Цитата Сообщение от сеня2007 Посмотреть сообщение
Что там может быть не правильное?
Покажите полностью весь код.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.02.2015, 07:38
https://www.cyberforum.ru/blog... g3207.html
0
1 / 1 / 0
Регистрация: 01.02.2015
Сообщений: 35
04.02.2015, 08:31  [ТС]
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Threading;
using System.IO.Ports;
using System.ComponentModel;
 
namespace ConsoleApplication2
{
    class Program{
    static void Main(string[] args) {
            PortListner listner = new PortListner("COM1");
            listner.RunWorkerCompleted += new RunWorkerCompletedEventHandler(listner_RunWorkerCompleted);
            listner.RunWorkerAsync();
            Console.ReadLine();
        }
 
        static void listner_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
            if (e.Error != null) {
                Console.WriteLine(e.Error.Message);
                return;
            }
            if (e.Result == null) {
                Console.WriteLine("Device not answered!");
            }
            else {
                Console.WriteLine("Answer from device: {0}", (string)(e.Result));
            }
        }
    }
    class PortListner : BackgroundWorker {
        private SerialPort port;
 
        public PortListner(string portName) {
            port = new SerialPort(portName, 4800);
        }
        protected override void OnDoWork(DoWorkEventArgs e) {
            byte[] ascFromMaster = { 0xb5, 1, 0x00, 0x29, 0x00 };
                                   //SB    ADDR  NBB   CMD   Dx    CHKS
            ascFromMaster[4] = GetCHSum(ascFromMaster);
            int readSize = 5;
            port.Open();
 
            for (int i = 0; i < 5; i++) {
                List<byte> dataFromSlave = new List<byte>();
                if (ReadBlock(ascFromMaster, dataFromSlave, readSize)) {
                    string answer = BitConverter.ToString(dataFromSlave.ToArray());
                    e.Result = answer;
                    return;
                }
                else {
                    Thread.Sleep(500);
                }
            }
            e.Result = null;
        }
        private bool ReadBlock(byte[] dataToWrite, List<byte> dataToRead, int readSize) {
            for (int i = 0; i < 10; i++) {
                port.DiscardInBuffer();
                port.Write(dataToWrite, 0, dataToWrite.Length);
                int index = 0;
                while (index < 10) {
                    if (port.BytesToRead == readSize) {
                        for (int j = 0; j < readSize; j++) {
                            dataToRead.Add((byte)(port.ReadByte()));
                        }
                        return true;
                    }
                    else {
                        Thread.Sleep(10);
                    }
                    index++;
                }
            }
            return false;
        }
        private byte GetCHSum(byte[] data) {
            byte temp_1 = (byte)(data.Sum(b => b) & 0xf);
            byte temp_2 = (byte)(data.Sum(b => b >> 4) << 4);
            return (byte)(temp_1 | temp_2);
        }
    }
}
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.02.2015, 10:40
сеня2007, Вроде все верно, должно работать))) Попробую изменить у себя так как у вас и посмотрю результат.
0
1 / 0 / 1
Регистрация: 02.02.2015
Сообщений: 79
04.02.2015, 13:28
Цитата Сообщение от Psilon Посмотреть сообщение
ну тогда попивайте чай и читайте хабр, а на задачу забивайте. "Передать данные по протоколу, а мы его тебе не дадим" это просто занавес.
если не уточняют протокол, значит можно любой пользовать ))))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.02.2015, 13:28

Получение данных с весов, подключенных к ПЛК PSA-04.12.0220.00.00 через COM-порт over радиоканал
Помогите новичку. Появилась необходимость поправить программку, написанную на Дельфи. Исходников нет - насколько смогла, декомпилировала,...

Отправка данных в COM порт
Доброго дня, ребята, прошу мне помочь с лабой. Надо написать программу которая открывает и закрывает порт, и отправляет туда данные, и...

Передача данных в COM порт
Привет всем! Помогите с кодом. Есть цифровой магнитофон для охранных нужд. В руководстве пользователя есть такая таблица кодов для...

Передача данных на com порт
Здравствуйте. Написал прогу, которая отправляет сообщение по байтово в виде char, как переделать ее так, чтобы отправлялось в виде массива,...

Передача данных на COM-порт
Проблемма в том что при передаче масива байтов на COM-порт программа зависает, а на COM-порт ничего не передаётся(проверялось...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение 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) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru