Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 04.11.2016
Сообщений: 18
.NET 4.x

Подскажите пожалуйста как получить ответ от устройства через COM порт

22.06.2017, 15:18. Показов 2796. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Встал вопрос работы с устройством на COM порту.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        static void Main(string[] args)
        {
            string[] portnames = SerialPort.GetPortNames();
 
            for (int i = 0; i < portnames.Length; i++)
                Console.WriteLine(portnames[i]);
 
            SerialPort port = new SerialPort(portnames[2]);
            port.Open();
 
            string command = "S";
            byte[] data = Encoding.UTF8.GetBytes(command);
            port.Write(data, 0, data.Length);
 
            byte[] dataR = new byte[500];
            port.Read(dataR, 0, dataR.Length);
 
            int databyte = port.ReadByte();
 
            Console.WriteLine(databyte);
 
            Console.ReadKey();
        }
Это то, что есть. Есть даже протокол общения с устройством. Помогите пожалуйста, никак не могу получить сообщение в ответ.

Протокол:
1. 8N1, скорость передачи 115200 бит/с

2. Длина данных в посылке не более 1 Кбайт. Между посылками должен быть перерыв не менее 10 мс.

3. Передача идентификатора, длины данных, данных и контрольной суммы в ASCII-HEX виде

4. Поле длины данных — 2 байта старшим вперед

5. Tаймаут между байтами max 10 мс

6. Старт-символ, стоп-символы, идентификатор и контрольная сумма в длину не входят

7. Контрольная сумма включает в себя идентификатор, длину данных и данные.

8. Посылки с некорректной длиной (указанная длина данных не соответствует количеству переданных/принятых байт), контрольной суммой, идентификатором не равным 0х80, игнорируются.

9. Идентификатор – 0х80.

Добавлено через 2 часа 19 минут
Неужели никто не знает?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.06.2017, 15:18
Ответы с готовыми решениями:

Как получить ответ на открытый порт UDP
Доброго времени суток! Делаю небольшую программку которая отправляет широковещательный запрос на 239.255.255.250:1900 Требуется...

Подскажите Пожалуйста как Открыть порт
Люди, Помогите Пожалуйста Отктыть 80-ый Порт. И не толька 80-ый. Я уже всё облазил ничего найти нормаль не могу. У меня 7-ая Винда.

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

17
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
22.06.2017, 15:31
Цитата Сообщение от Darprod Посмотреть сообщение
Неужели никто не знает?
Ну для начала вы бы выложили спецификации протокола обмена, раз
Цитата Сообщение от Darprod Посмотреть сообщение
Есть даже протокол общения с устройством
0
Эксперт .NET
 Аватар для Rius
13092 / 7651 / 1672
Регистрация: 25.05.2015
Сообщений: 23,293
Записей в блоге: 14
22.06.2017, 15:40
Даже настройки порта нет...
0
0 / 0 / 0
Регистрация: 04.11.2016
Сообщений: 18
22.06.2017, 15:50  [ТС]
Как настраивать порт? И что подразумевается под настройками порта? Извините, я просто новенький(
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
22.06.2017, 16:05
Цитата Сообщение от Darprod Посмотреть сообщение
Как настраивать порт?
Как обычно. Создали и установили его свойства, что вам нужны.
Протокол я посмотрел, ничего особо сложного. Единственное что смущает-размер данных переменной длины, а поскольку порт-штука относительно тормозная, придется считать стартовый байт, потом идентификатор, потом размер блока и уж потом дочитывать остаток пакета. Но реализуется не сложно, по сути.
0
0 / 0 / 0
Регистрация: 04.11.2016
Сообщений: 18
23.06.2017, 08:58  [ТС]
Вы не могли бы мне помочь реализовать его на c#? Вот открыл я порт, как формировать правильно пакет? Я просто не разу не сталкивался с передачей байтов и т.п. вещами. Мне нужно просто подать команду "S". Что бы услышать ответ от него. Может быть я что то не понимаю и делаю не так?

Добавлено через 16 часов 41 минуту
Товарищи, подскажите пожалуйста кто-нибудь.
0
Эксперт .NET
 Аватар для Rius
13092 / 7651 / 1672
Регистрация: 25.05.2015
Сообщений: 23,293
Записей в блоге: 14
23.06.2017, 09:11
Лучший ответ Сообщение было отмечено Darprod как решение

Решение

Идёт Будда с учениками по дороге. Видит: яма, в ней вол, крестьянин пытается его вытянуть, но сил не хватает. Будда кивнул ученикам, они быстро помогли вытянуть животное.
Идут дальше, снова яма, в ней вол, на краю сидит крестьянин и горько плачет. Будда прошёл мимо и как бы не заметил. Ученики его спрашивают:

- Учитель, почему ты не захотел помочь этому крестьянину?

- Помочь плакать?
Кликните здесь для просмотра всего текста
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
SerialPort port = new SerialPort();
port.PortName = "COM1";
port.BaudRate = 115200;
port.Parity = Parity.Odd;
port.DataBits = 8;
port.StopBits = StopBits.One;
port.ReadTimeout = 10;
port.Open();
 
if (port.IsOpen)
{
    string request = "S";
    byte[] send = Encoding.ASCII.GetBytes(request);
    port.Write(send, 0, send.Length);
 
    Thread.Sleep(10);
    byte[] receive = new byte[1024];
    int readed = port.Read(receive, 0, receive.Length);
 
    if (readed > 0)
    {
        string answer = Encoding.ASCII.GetString(receive);
    }
 
    port.Close();
}
3
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.06.2017, 09:28
Rius, все бы хорошо, но только запрос (как и ответ) должен соответствовать протоколу. А с таким запросом в порт ТС будет ждать ответа до седьмого пришествия)))
0
Эксперт .NET
 Аватар для Rius
13092 / 7651 / 1672
Регистрация: 25.05.2015
Сообщений: 23,293
Записей в блоге: 14
23.06.2017, 09:31
Ну, я избегаю давать 100% готовые ответы тем (вообще, а не именно ТС), кто ждёт готового решения на форуме до седьмого пришествия...
1
0 / 0 / 0
Регистрация: 04.11.2016
Сообщений: 18
23.06.2017, 10:01  [ТС]
Спасибо, а как составить пакет для отправки? Как я понял - R потом 080 потом длину сообщения, потом сообщение, а вот контрольная сумма, это что и как? И откуда считать не понятно. С пакета в общем или только с данных. Я думаю, что контрольная сумма это сложение по модулю 2 байты. Но не уверен.
0
Эксперт .NET
 Аватар для Rius
13092 / 7651 / 1672
Регистрация: 25.05.2015
Сообщений: 23,293
Записей в блоге: 14
23.06.2017, 10:08
Цитата Сообщение от Darprod Посмотреть сообщение
И откуда считать не понятно. С пакета в общем или только с данных.
Обычно с начала пакета и включительно до байта перед суммой.
Контрольная сумма включает в себя идентификатор, длину данных и данные.
Цитата Сообщение от Darprod Посмотреть сообщение
а вот контрольная сумма, это что и как?
Хороший вопрос. В приведённом обрывке документе ни алгоритма, ни примеров нет. Предположения делать бессмысленно.
1
0 / 0 / 0
Регистрация: 04.11.2016
Сообщений: 18
23.06.2017, 10:13  [ТС]
При передаче сказали ВСС тип контрольной суммы, ищу в интернете, не могу найти что это. мб кто нибудь сталкивался?
0
Эксперт .NET
 Аватар для Rius
13092 / 7651 / 1672
Регистрация: 25.05.2015
Сообщений: 23,293
Записей в блоге: 14
23.06.2017, 10:31
Про BCC и в отрывке написано. Только вот переводится это вроде бы как "символ контроля блока", "Block Check Character". Это всё равно что "CRC" или "контрольная сумма".
Этого не достаточно.
А учитывая, что наши производители даже под одним названием могут реализовать разные алгоритмы...

Добавлено через 11 минут
Если примеров в документации нет, то есть один метод - брутфорс.
Составляете вручную заведомо правильный пакет, только на месте контрольной суммы перебираете числа от 0x00 до 0xFF.
Отправляете по очереди пакеты в устройство.
Если пришёл ответ, значит контрольная сумма правильная.
Далее берёте другой пакет, чтобы найти и для него контрольную сумму.
И так раз 5.
Потом анализируете пакеты и соответствующие им контрольные суммы.
1
0 / 0 / 0
Регистрация: 04.11.2016
Сообщений: 18
23.06.2017, 10:35  [ТС]
Есть на делфях реализация составления пакета, не поможете переделать на c#?

Delphi
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
procedure prepare_out(s:string);
var
 i,j:integer;
 b:byte;
 tempbuf:buftype;
begin
 tempbuf[0]:=ord('R');
 tempbuf[1]:=$80;
 tempbuf[2]:=length(s) div 256;
 tempbuf[3]:=length(s) mod 256;
 for i:=4 to length(s)+3 do
  tempbuf[i]:=ord(s[i-3]);
 out_count:=length(s)+4;
 b:=0;
 for i:=1 to out_count-1 do
  b:=b xor tempbuf[i];
 tempbuf[out_count]:=b;
 inc(out_count);
 
 sendbuf[0]:=ord('R');
 j:=0;
 i:=1;
 while i<out_count do
  begin
   b:=tempbuf[i] shr 4;
   inc(j);
   sendbuf[j]:=to_asc(b);
   inc(j);
   b:=tempbuf[i] and $0f;
   sendbuf[j]:=to_asc(b);
   inc(i);
  end;
 inc(j);
 sendbuf[j]:=$0d;
 inc(j);
 sendbuf[j]:=$0a;
 out_count:=j;
end;
 
 
//преобразование числа в ASCII
function to_asc(vh:byte):byte;
begin
 if vh<10 then vh:=vh+48 else vh:=(vh-10)+65;
 result:=vh;
end;
0
Эксперт .NET
 Аватар для Rius
13092 / 7651 / 1672
Регистрация: 25.05.2015
Сообщений: 23,293
Записей в блоге: 14
23.06.2017, 10:41
Попробуйте сами.
Цитата Сообщение от Darprod Посмотреть сообщение
b:=b xor tempbuf[i];
Простой XOR ^ байт, предшествующих BCC.
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.06.2017, 10:58
Лучший ответ Сообщение было отмечено Darprod как решение

Решение

Darprod, вот примерный набросок для решения вашей задачи. Алгоритм просчета КС реализуйте сами, в теле метода, который для этого предназначен. В остальном вроде бы запрос формируется корректно.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.IO.Ports;
using System.Threading;
using System.ComponentModel;
 
namespace Darprod_Test {
    class Program {
        static void Main(string[] args) {
            string dataString = "S";
            M_100ESWorker worker = new M_100ESWorker("COM1");
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
            worker.RunWorkerAsync(dataString);
            Console.ReadLine();
        }
 
        static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
            if (e.Error != null) {
                Console.WriteLine(e.Error.Message);
                return;
            }
            
            string response = Encoding.ASCII.GetString(e.Result as byte[]);
            Console.WriteLine("Response is: {0}", response);
        }
    }
    class M_100ESWorker : BackgroundWorker {
        SerialPort _port;
 
        public M_100ESWorker(string portName) {
            _port = CreatePort(portName);
            this.WorkerReportsProgress = true;
        }
        protected override void OnDoWork(DoWorkEventArgs e) {
            if (e.Argument as string == null || string.IsNullOrWhiteSpace((string)e.Argument)) {
                throw new Exception("Wring data string!");
            }
            using (_port) {
                _port.Open();
                byte[] response = GetResponse((string)e.Argument);
                e.Result = response;
            }
        }
 
        private byte[] GetResponse(string dataString) {
            byte[] request = CreateRequest(dataString);
 
            const int HEADER_SIZE = 4;
            const int TAIL_SIZE = 4;
 
            for (int i = 0; i < 5; i++) {
                _port.DiscardInBuffer();
                _port.DiscardOutBuffer();
                _port.Write(request, 0, request.Length);
                for (int j = 0; j < 5; j++) {
                    if (_port.BytesToRead == HEADER_SIZE) {
                        byte[] header = new byte[HEADER_SIZE];
                        _port.Read(header, 0, HEADER_SIZE);
                        if (header[0] == 0x52 && header[1] == 0x80) {
                            int bodyLength = header[2] * 0x100 + header[3];
                            if (bodyLength == 0) {
                                throw new Exception("Data not present!");
                            }
                            byte[] body = new byte[bodyLength + TAIL_SIZE];
                            if (_port.BytesToRead != body.Length) {
                                throw new Exception("Wrong data length!");
                            }
                            _port.Read(body, 0, body.Length);
                            return body.Take(bodyLength).ToArray();
                        }
                    }
                    else {
                        Thread.Sleep(100);
                    }
                }
            }
            throw new TimeoutException("Device not answers!");
        }
 
        private byte[] CreateRequest(string dataString) {
            List<byte> request = new List<byte>();
            //Старт-символ и идентификатор
            request.AddRange(new byte[] { 0x52, 0x80 });
            byte[] body = Encoding.ASCII.GetBytes(dataString);
            //Длина данных
            request.AddRange(new byte[] { (byte)(body.Length >> 8), (byte)(body.Length) });
            //Данные
            request.AddRange(body);
            //Контрольная сумма
            int sum = GetChecksum(request);
            request.AddRange(new byte[] { (byte)(sum >> 8), (byte)(sum) });
            //Стоп-символы
            request.AddRange(new byte[] { 0x0D, 0x0A });
            return request.ToArray();
        }
 
        private int GetChecksum(List<byte> body) {
            //Тут создаем КС по нужному алгоритму
            return 0;
        }
        private SerialPort CreatePort(string portName) {
            SerialPort port = new SerialPort(portName, 115200);
            port.Parity = Parity.Odd;
            port.DataBits = 8;
            port.StopBits = StopBits.One;
            return port;
        }
    }
}
2
0 / 0 / 0
Регистрация: 04.11.2016
Сообщений: 18
23.06.2017, 11:47  [ТС]
Большое спасибо за ответ! Только вот я про КС не до конца понял. Мне нужно брать все до КС и первый байт ^ со вторым, результат ^ c третим. Правильно понял?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.06.2017, 11:50
Цитата Сообщение от Darprod Посмотреть сообщение
Только вот я про КС не до конца понял.
Darprod, самый лучший вариант-уточнить это у того, кто задал вам такое задание.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.06.2017, 11:50
Помогаю со студенческими работами здесь

Подскажите пожалуйста ответ
1.Как подсчитать количество дней с момента регистрации на сайте если в базе данных есть только дата регистрации? Мне нужно вывести...

Как отправить и получить ответ от php через ajax?
Здравствуйте. Не совсем было понятно, где создавать тему (php или js). Если ошибся, приношу свои извинения. Есть вот такая форма:...

подскажите как открыть порт на D-link DES-3200-10 через вэб интерфейс
подскажите как пробросить порт на Dlink DES-3200-10 через вэб интерфейс ? не могу найти никак(

Подскажите, как найти ip, и следующий за ним через произвольное число символов порт?
Ковырял себе утилитку парсер для грабежа открытых прокси списков (блокировки не дремлют, а хочется удобства). В общем надо в таком тексте: ...

Как отправить данные на url через сокет и получить ответ
Подскажите пожалуйста как отправить данные на url и получить ответ, а то у меня что то не очень хорошо получается. Заранее благодарю.


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru