С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/40: Рейтинг темы: голосов - 40, средняя оценка - 4.85
2 / 2 / 2
Регистрация: 23.09.2014
Сообщений: 28
.NET 4.x

Считывание данных с COM-порта

27.10.2014, 13:47. Показов 7577. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема со считывание ответа с ком-порта, ответ приходит частями, хотя стандартная программа для этого устройства, отсылая тот же запрос, получает весь ответ сразу.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
serialPort1 = new SerialPort("COM1", 19200, Parity.None, 8, StopBits.One);
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
   {
         int intBytes = serialPort1.BytesToRead;
         byte[] bytes = new byte[intBytes];
         serialPort1.Read(bytes, 0, intBytes);
         string s = BitConverter.ToString(bytes);
         this.BeginInvoke(new LineReceivedEvent(LineReceived), s);
    }
private delegate void LineReceivedEvent(string POT);    
private void LineReceived(string s)
    {
         textBox1.Text = s;    
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.10.2014, 13:47
Ответы с готовыми решениями:

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

Считывание данных с COM порта
Здравствуйте! Как можно прочитать данные из COM порта, пишу в MS Visual Studio 2010. Знаю что нужно использовать SerialPort port = new...

Считывание данных с COM-порта
Здравствуйте! Пишу программу для считывания данных с com-порта(zigbee-модуль с микроконтроллером JN-5139, подключается по интерфейсу UART)....

18
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.10.2014, 14:20
Цитата Сообщение от Malzus Посмотреть сообщение
стандартная программа для этого устройства, отсылая тот же запрос, получает весь ответ сразу.
Она так вам и говорит: "я получила весь ответ сразу"?
Или может все-таки получила по кускам, склеила вместе и выдала готовый ответ?
0
2 / 2 / 2
Регистрация: 23.09.2014
Сообщений: 28
27.10.2014, 15:02  [ТС]
Смотрел через Serial Port Monitor, запросы одинаковые, т.е. что я отправлю и стандартный конфигуратор, а вот ответ приходит если я отправил кусками, а вот если конфигуратором то тот же самый ответ только сразу целиком.
Пробовал собирать вот так, в итоге получаю ответ полностью, но это слишком замедляет мониторинг, вообще я задался этим вопросом, т.к. конфигуратор получает ответ сразу целиком.
C#
1
2
3
4
private void LineReceived(string s)
    {
         textBox1.Text += " " + s;  
    }
Цитата Сообщение от kolorotur Посмотреть сообщение
Или может все-таки получила по кускам, склеила вместе и выдала готовый ответ?
И нет конкретно одним ответом.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.10.2014, 15:46
Цитата Сообщение от Malzus Посмотреть сообщение
Смотрел через Serial Port Monitor, запросы одинаковые
А если в вашем коде вообще код считывания убрать, то монитор показывает, что данные на порт приходят?

Если нет, то попробуйте у объекта SerialPort выставить свойство ReceivedBytesThreshold на что-то по-больше. По умолчанию оно установлено на единицу, это значит, что событие DataReceived будет вызвано как только на порт придет хотя бы один байт данных.
Само-собой, считывание данных будет происходить быстрее, чем их отправка по шнуру.
0
 Аватар для cer
8 / 19 / 9
Регистрация: 16.09.2014
Сообщений: 102
27.10.2014, 15:58
Цитата Сообщение от Malzus Посмотреть сообщение
ответ приходит частями
В некоторых устройствах необходимо выдержать задержку после отправки и перед чтением. Возможно контроллер не успевает полностью заполнить буфер а вы его уже считываете. У меня так уже было. Посмотрите через Serial Port Monitor какие времена записи и считавания
Также проверьте нет ли других конфигурирующих комманд, может там устанавливается размер отправного буфера.
0
2 / 2 / 2
Регистрация: 23.09.2014
Сообщений: 28
28.10.2014, 10:32  [ТС]
Вот лог открытия порта + отправка запроса и ответ.
My.rar - это моей программой, Config.txt - это стандартным конфигуратором.
Вложения
Тип файла: txt config.txt (11.7 Кб, 33 просмотров)
Тип файла: rar my.rar (3.1 Кб, 35 просмотров)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.10.2014, 13:00
Цитата Сообщение от Malzus Посмотреть сообщение
Config.txt - это стандартным конфигуратором.
Так это же просто лог — программа выводит сообщение после того, как оно полностью получено.

Просканируйте порт каким-нибудь сниффером, чтобы видеть как именно идут данные: сразу или по кускам.
0
2 / 2 / 2
Регистрация: 23.09.2014
Сообщений: 28
28.10.2014, 13:41  [ТС]
kolorotur,
В том то и дело что там написано Data Lenght 245, а у меня по 14 и так несколько раз.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.10.2014, 14:28
Цитата Сообщение от Malzus Посмотреть сообщение
там написано Data Lenght 245, а у меня по 14 и так несколько раз.
Ну, 14 + сколько-то еще несколько раз = 245.
Считывайте ответ за несколько приемов и выводите в лог только тогда, когда считаете его полностью.
Именно это и делает конфигуратор: выводит лог только после того, как полностью считает ответ (не важно за сколько заходов)
0
2 / 2 / 2
Регистрация: 23.09.2014
Сообщений: 28
28.10.2014, 14:43  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Именно это и делает конфигуратор: выводит лог только после того, как полностью считает ответ (не важно за сколько заходов)
В том то и дело что этот лог делался через Serial Port Monitor, а не самим конфигуратором.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.10.2014, 15:32
Цитата Сообщение от Malzus Посмотреть сообщение
В том то и дело что этот лог делался через Serial Port Monitor, а не самим конфигуратором.
А, понятно.

Что по поводу этого?
Цитата Сообщение от kolorotur Посмотреть сообщение
А если в вашем коде вообще код считывания убрать, то монитор показывает, что данные на порт приходят?
0
2 / 2 / 2
Регистрация: 23.09.2014
Сообщений: 28
29.10.2014, 05:23  [ТС]
kolorotur,
А вот это смогу проверить только завтра, т.к. уже не на работе.

Добавлено через 13 часов 26 минут
Цитата Сообщение от kolorotur Посмотреть сообщение
Что по поводу этого?
Посмотрел и ответа нет вообще, "IOCTL_SERIAL_WAIT_ON_MASK" и "IOCTL_SERIAL_GET_COMMSTATUS".
Они выходят только после того как отправил на устройство. Значит дело в коде считывания, что можете подсказать.
Длина неизменно будет 245 и если устройство отключено ответа никакого вообще не будет соответственно.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.10.2014, 10:25
Malzus, позвольте уточнить: вы отсылаете команду на устройство, но если убрать код считывания ответа, то монитор не засекает входящих данных (ответа) от этого устройства?
То есть монитор видит входящие данные только тогда, когда вы непосредственно считываете ответ?
0
2 / 2 / 2
Регистрация: 23.09.2014
Сообщений: 28
29.10.2014, 11:29  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
То есть монитор видит входящие данные только тогда, когда вы непосредственно считываете ответ?
Он пишет "IOCTL_SERIAL_WAIT_ON_MASK", а ответа нету, причём пишет раз 40 этот статус.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.10.2014, 12:36
Malzus, каким монитором порта пользуетесь? Я использую free-serial-port-monitor, неплохой монитор, все что надо видно.
0
2 / 2 / 2
Регистрация: 23.09.2014
Сообщений: 28
29.10.2014, 12:58  [ТС]
Я использую Serial Port Monitor, логи делал через него, вообще странно получается если сравнить логи с конфигуратора и мой, получается при отправке одинакового запроса.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.10.2014, 16:16
Цитата Сообщение от Malzus Посмотреть сообщение
странно получается
Malzus, понимаете, какое дело... Насколько я знаю логику работы монитора порта, то она примерно такая. Вы пишете в порт какой-то массив байт. Монитор это показывает. Но тут есть нюанс. Если вы в своей программе не поставите команду на чтение данных из порта (хотя вы знаете на 100500%, что в ответ на такой запрос они приходят), монитор этого не увидит и естественно, не отобразит... И вот тут и объяснение разницы: вы же не знаете логику работы той программы, которую пытаетесь воспроизвести. Возможно, что чтение там начинается при достижении в буфере порта какого-то определенного количества байт...
0
2 / 2 / 2
Регистрация: 23.09.2014
Сообщений: 28
29.10.2014, 16:26  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Возможно, что чтение там начинается при достижении в буфере порта какого-то определенного количества байт...
Об этом как то не задумывался, вот только в логе с конфигуратора вообще отсутствует такое событие "IOCTL_SERIAL_WAIT_ON_MASK", хотя когда я принимаю ответ, мне буквально сыпит ими по 20 data lenght.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.10.2014, 16:30
Цитата Сообщение от Malzus Посмотреть сообщение
в логе с конфигуратора вообще отсутствует такое событие
Malzus, а это важно? Насколько я понял, ваша задача - отправить запрос и получить ответ. Вот и отслеживайте именно запросы-ответы, на все остальное не обращайте большого внимания. Повторюсь, внутренняя логика реализации исследуемой программы вам неизвестна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.10.2014, 16:30
Помогаю со студенческими работами здесь

Считывание данных с COM порта
Необходимо считать данные с COM порта, а именно координаты формата GPGGA. Есть ли достойный эмулятор COM порта с которого можно отправлять...

Считывание данных c виртуального COM порта?
Добрый день ! По интерфейсу rs485 на виртуальный сом порт приходят данные, как их с помощью РНР можно считать?

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

Считывание данных с COM порта. завтра защита диплома
всем привет, немогу никак понять, как считывать данные с COM порта. пробовал пользоваться библиотекой comm32 и comport libary. может...

Открытие Dialog порта и считывание с него данных при компиляции
Привет!Пишу прогу для com-порта: открытие, считывание, запись( для проверки в файл кидаю инфу). Работаю с Visual Studio не давно, пишу в...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru