|
|
|
Класс для COM-порта с поддержкой событий05.09.2014, 11:48. Показов 11681. Ответов 30
Доброго. Мне нужен класс для работы с COM-портом с поддержкой событий.
У меня есть вариант: Serial Port Communication in Excel (VBA). Я его использую в Excel. Проблема в том, что нужно ручками регулировать время между командой и ответом, чтобы гарантировано принять данные во входной буфер. Хотелось бы иметь событие OnReceive(), которое основано на WaitCommEvent(). Без событийного решения трудно реализовать оптимальный по скорости алгоритм работы с устройствами. Мне нужно с определённой частотой читать данные и желательно получать их по мере заполнения входного буфера нужной посылкой. Можно ли что-то такое сделать на vb6? Мне не нужны сторонние решения в готовом виде (ActiveX, dll и т.п.). Нужно всё реализовать на макросах в таблице.
0
|
|
| 05.09.2014, 11:48 | |
|
Ответы с готовыми решениями:
30
Календарь событий с заметками и поддержкой файлов Кто встречал контрол типа стандартного Line, но с поддержкой событий? |
|
|
|
| 05.09.2014, 16:28 [ТС] | |
|
Да, можно так, но это в лучшем случае. Можно просто в цикле дожидаться появления флага RX и выходить из цикла, либо по таймауту. Сейчас я использую код выше где тупо вставляю некоторую эмпирическую задержку, чтобы ответ точно находился в буфере приёмника, т.е. пакет принят и я его могу считать при помощи WinAPI. Но это плохой вариант, если мне нужно вести работу на десятках герц (в зависимости от скорости и длины посылки). Иногда данные выпадают (буфер пустой при чтении), а с одним прибором я вообще не могу организовать такую связь, хотя одиночные команды работают нормально. Ещё есть прибор, который сам шлёт данные без запроса. С ним тоже не просто, если нет события.
Не пойму пока в чём дело, может что-то с таймаутами, которые в коде взяты с потолка, может ещё что, но всё равно, мне нужен стабильный факт приёма или превышение таймаута на ожидание ответа. Т.е. два даже события. Примеры есть в сети, но не для бейсика. Мне трудно их с ходу перевести. Видел хороший пример реализации класса на delphi, но найти его не могу сейчас. Там всё чисто на WinAPI, как мне надо.
0
|
|
|
|
|
| 07.09.2014, 07:29 [ТС] | |
|
Спасибо за код, но он не подойдёт в моём конкретном применении. Дело в том, что я использую vba, а его существует 4 разновидности: 2 разрядности и версии до и после 2010. Мне нужен универсальный код на макросах, который бы охватывал и разрядности, и старые версии офиса. Ассемблер уже перебор. Я WinAPI функции с трудом описываю для всех вариантов.
0
|
|
|
|
|
| 08.09.2014, 11:20 [ТС] | |
|
The trick, WaitForSingleObject() подходит, только я ещё толком не понял как его использовать правильно в моём случае. Вот статья из MSDN, где есть куски нужного мне кода по чтению данных из приёмного буфера: Serial Communications.
У меня алгоритм такой (командный вариант): 1. Сбрасываем входные буферы приёмника и передатчика (имеются в виду системные). 2. Посылаем команду чтения и ожидаем приёма в течении некоторого таймаута чтения. 3. Считываем данные из системного буфера. Мне нужно, чтобы в течении таймаута я считывал только тогда, когда ответ действительно будет в буфере, а не в произвольный момент времени с эмпирической задержкой, как сейчас я это делаю. Операция ReadFile() должна ожидать нужного количества принятых байт, а потом уже возвращать результат. Та функция, которую я сейчас использую, так не делает. Она сразу возвращает результат. Поэтому я искусственно ввожу задержку. Возможно у меня проблема в том, что умолчания, по которым идёт работа с COM-портом, настроены не так как мне нужно. Судя по статье, есть два варианта использования функций чтения: блокирующий и неблокирующий (определяется специальным параметром). Наверное у меня включено неблокирующее чтение, но обработка его идёт не полностью. Вот ещё одна ссылка на набор функций для работы с COM-портом через WinAPI: Serial Port Communication. Добавлено через 1 час 17 минут У меня есть ещё и другая проблема. Операция записи буферизируется системой. В результате чего вместо трёх посылок (команд) фактически посылается одна. Пока не понял как это победить. Проще всего, наверное, сделать все операции блокирующими, но это повлияет на интерфейс пользователя при длительных операциях, а у меня в форме строка прогресса обновляться должна. В общем, всё довольно сложно и придётся разбираться для достижения нужного эффекта с реальными приборами.
0
|
|
|
Модератор
|
|
| 08.09.2014, 16:49 | |
0
|
|
|
Модератор
|
||
| 10.09.2014, 14:15 | ||
|
0
|
||
|
|
|||||||||||
| 18.09.2014, 12:12 [ТС] | |||||||||||
|
Помогите перевести работающий код с c++/cli на vb6. У меня проблема с заполнением буфера при чтении в vb6 версии.
В качестве шаблона для vb6 версии можно взять модуль по ссылке, на которую я указывал выше. Я сам переделал под себя, запрос-ответ происходит (слежу монитором порта), а вот в приёмный буфер данные не записываются, хотя принятое количество байт показывается. Не пойму в чём дело.
0
|
|||||||||||
|
|
|||
| 18.09.2014, 14:19 [ТС] | |||
|
0
|
|||
|
Модератор
|
|
| 18.09.2014, 15:48 | |
|
уни, у тебя в коде на C++ буфер представляет собой массив из 21 элемента типа char (аналог VB6 - byte). Ты туда вставил String. Вопрос - зачем? String - это не char, String - это BSTR*. BSTR - WCHAR*. WCHAR - 16-bit Unicode character, на 8-битный char вообще не похоже.
0
|
|
|
|
|
| 18.09.2014, 15:55 [ТС] | |
|
Это не я вставил, это так было и это не суть важно, так как я могу получить байтовый массив из строки. Важно тут другое, этот буфер при принятии ответа не заполняется. При отладке, когда я принимаю ответ, он пуст, хотя алгоритм приема работает нормально и даже возвращает количество принятых байт.
0
|
|
|
Модератор
|
|||
| 18.09.2014, 16:02 | |||
|
уни, думаешь я просто так написал тебе этот пост?
0
|
|||
|
|
|
| 18.09.2014, 16:47 [ТС] | |
|
Не суть важно, потому что это выделенная область неуправляемой памяти, доступная для чтения и записи. Если запись и чтение с этой областью происходят, то мне нет дела пока до того как это оформлено.
Его код в оригинале работает даже с бинарными данными, я проверял. Пусть там будет пока строка или что угодно. Главное, чтобы указатели были правильные. Мне пока нет дела до интерпретации. Мне нужен просто факт того, что в буфере что-то есть. Когда я перешёл на OVERLAPPED режим, то у меня изменился внутренний системный алгоритм работы. Я долго доводил до ума программу на c++, прежде чем она заработала как надо. Там очень много тонкостей как оказалось. Я не думаю, что проблема в том, что используется строка вместо указателя на выделенный участок памяти. Пусть это некорректно, но что-то должно попадать в буфер всё-равно. У меня была похожая проблема в программе на c++, когда я не мог принять ответ, хотя команда проходила. Оказалось, что нельзя при таком режиме оставлять нулевые таймауты для чтения при настройке порта. Когда я их изменил, ReadFile начала заполнять буфер и возвращать результат.
0
|
|
|
Модератор
|
|||||||
| 18.09.2014, 16:54 | |||||||
|
0
|
|||||||
|
|
||
| 18.09.2014, 17:42 [ТС] | ||
|
Ты даёшь совет как мне красивее и правильнее доставать байты из буфера? Хм. В полезности совета не сомневаюсь, но не хочу пока трогать то, что и так работает. Остальное доделаю сам.
0
|
||
| 18.09.2014, 17:42 | |
|
Помогаю со студенческими работами здесь
20
Класс длинная арифметика с поддержкой арифметических операций Нужен батник для создания отчета событий и их свойств из журнала событий на локальном компьютере Реализовать хранилище событий, для хранения событий в БД Подскажите бесплатный хостинг с поддержкой MySQL баз и с поддержкой внешних подключений к базе данных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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(), которая. . .
|