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

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

27.10.2014, 13:47. Показов 7593. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru