Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/41: Рейтинг темы: голосов - 41, средняя оценка - 4.90
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712

Асинхронное чтение данных из COM порта

18.10.2016, 11:21. Показов 9025. Ответов 60
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех. Совсем недавно получил я нелестные высказывания по поводу моего способа чтения информации из COM порта. Решил исправляться, но знаний маловато. Поэтому прошу помощи.

Итак, посоветовали мне использовать асинхронное чтение (ну и запись, соответственно). Подскажите, как это выполнить по возможности пока без использования потоков при следующих условиях. Send - буфер данных, которые надо отправить в COM порт (запрос), Get - буфер, куда надо принять данные из COM порта (ответ). Отправить надо 4 байта. По протоколу обмена в ответ может быть получено 10 байт (если запрос корректен и правильно дошел до получателя), 5 байт (запрос содержит ошибку или неправильно дошел до получателя). Кроме этого связь может быть нарушена и в ответ не будет получено ни одного байта. Ждать ответ надо максимум 3 секунды после отправки запроса, но если ответ есть (10 или 5 байт), то он должен быть принят максимально быстро (без ожидания 3-х секунд).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.10.2016, 11:21
Ответы с готовыми решениями:

Асинхронное чтение из COM-порта
Уважаемые спецы! Помогите, плиз, понять небольшую проблему. написал чтение с COM-порта. считывает все нормально, но дает ошибку...

Асинхронное чтение последовательного порта. MVVM
Здравствуйте уважаемые форумчане! Такая проблема. Писал код, для чтения com порта на c# form еще, все работало прекрасно. Перекинул...

Чтение данных с COM-порта
Доброго времени суток. Уверен тема поднималась не раз, уже все прочитал разобраться не смог. В общем есть сканер который подключается по...

60
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
18.10.2016, 15:07
d7d1cd, Ваш интерес практический или учебного плана? Если первое, то мой совет - использовать для этой цели готовый компонент и не забивать себе голову разными "CreateFile, ComTread' etc. Используете же вы компонент Chart вместо того, чтобы рисовать на канве, или ProgressBar вместо панели с рисунком. Компонент (бесплатный) BCPort достаточно удобен в работе (и лично у меня заслужил одобрение... ).
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
18.10.2016, 16:27  [ТС]
nick42, интерес практический. Где взять компонент?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
18.10.2016, 16:38
Цитата Сообщение от d7d1cd Посмотреть сообщение
Где взять компонент?
Я взял на сайте "торри" (за ссылки здесь бьют по рукам, но поскольку он бесплатный, могу скинуть архив). Я это буквально сейчас не проверял, но теоретически должен скомпилироваться без больших проблем.
Вложения
Тип файла: zip BComPort.zip (11.8 Кб, 80 просмотров)
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
19.10.2016, 09:00  [ТС]
nick42, не получается установить компонент в C++Builder XE8. Делаю следующим образом. Распаковал архив. В RAD выбираю File->Open... и выбираю файл BComPort.bpr. После загрузки проекта выбираю Project->Build BComPort. В результате сначала выходит подряд 3 окна после нажатия Cancel (приведены внизу), а в конце ошибка компиляции [DCC Fatal Error] pasall.tmp(1): F1027 Unit not found: 'System' or binary equivalents:
Pascal
1
2
3
4
5
program pasall;
uses
  BCPort in 'BCPort.pas';
begin
end.
Подскажите, как победить...
Миниатюры
Асинхронное чтение данных из COM порта   Асинхронное чтение данных из COM порта   Асинхронное чтение данных из COM порта  

0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
19.10.2016, 10:12
Цитата Сообщение от d7d1cd Посмотреть сообщение
Подскажите, как победить...
Наверное - никак. Исходный компонент ориентирован на Delphi (Pascal); с версиями 5, 6, 7 и то конфликты постоянные по поводу набора библиотек (Uses...). Это что касается установки компонентов на старые платформы (BCB6, BCB5), а уж про ХЕ и говорить нечего.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
19.10.2016, 10:52
Тут получается некий парадокс
Старые компоненты не работают в новых IDE, а в новых IDE нет нужных компонент
Тоже намучился уже с XE 10.1
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
19.10.2016, 10:55
Почтальон, зато приобретаете бесценный опыт; он в практике программирования тоже не в хвосте очереди.
1
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
19.10.2016, 10:58  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
Наверное - никак.
Цитата Сообщение от Почтальон Посмотреть сообщение
а в новых IDE нет нужных компонент
М-дя... Может все-таки есть другой бесплатный компонент для работы с COM портом, который установился бы на XE8?
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
19.10.2016, 11:53
Боюсь что бесплатных вообще нет
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
19.10.2016, 11:54  [ТС]
Цитата Сообщение от Почтальон Посмотреть сообщение
Боюсь что бесплатных вообще нет
А платные в какую цену?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
19.10.2016, 12:01
Посетите ТОРРИ.НЕТ , подраздел Communications; там и бесплатных несколько есть. А для ХЕ8 - только шароварные
Миниатюры
Асинхронное чтение данных из COM порта  
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
19.10.2016, 12:20
Цитата Сообщение от d7d1cd Посмотреть сообщение
А платные в какую цену?
К сожалению даже не озадачивался таким вопросом. Стоит девственная XE 10.1
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
19.10.2016, 13:48  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
...и не забивать себе голову разными "CreateFile, ComTread'...
Чувствуется, что придется забивать этим голову. Хотя, может быть, это приведет к рождению своего компонента для работы с COM портом...
Итак, вернемся к вопросу об асинхронном чтении данных из COM порта. Но сначала порт нужно открыть так, чтобы функции чтения и записи могли работать в асинхронном режиме. COM порт с именем в PortName открываю так:
C++
1
2
HANDLE COMPort = CreateFile(PortName.w_str(), GENERIC_READ | GENERIC_WRITE, 
                            0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
Далее я настраиваю порт и отправляю туда запрос. Как отправить запрос при асинхронной работе?

Добавлено через 17 минут
Не могу разобраться как использовать функции GetOverlappedResult, WaitCommEvent, WaitForSingleObject и нужны ли они все в моем случае.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
19.10.2016, 15:59
"Волков бояться - в лес не ходить". Только что ради эксперимента попробовал установить этот компонент на платформе ХЕ4. Это оказалось возможным. Думаю, что и на ХЕ8 процедура похожая. Окончательный вывод сделать не возьмусь, так как мало опыта "борьбы с юникодным представлением", а в том варианте, что я сделал наспех, на стадии линковки выдает ошибку Unresolved external '__fastcall Bcport::TBComPort::SetPortW(const System::AnsiStringT<0>)' referenced from C:\USERS\USER\DOCUMENTS\RAD STUDIO\PROJECTS\11\WIN32\RELEASE\UNIT1.O BJ. То-есть назначение порту имени COM1 к примеру уже осложнено (unicode, tchar ... ). Бодаться с этим мне пока не хочется; это занятие для любителей эмбаркадеро всех последних версий
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
19.10.2016, 16:21  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
Только что ради эксперимента попробовал установить этот компонент на платформе ХЕ4. Это оказалось возможным.
nick42, поделитесь процедурой установки.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
19.10.2016, 16:37
Ну, для начала создаете новый Package, добавляете в него BCPort.pas (BCPort.dcr должен быть рядом с ним), пробуете Make, Build этого созданного Package. У меня кроме кучи "варнингов" стопорнулось на строках 211-212 файла BCPort.pas < uses Forms >. Я посчитал, что формы тут ни к чему, и закомментировал эти строчки. Следующий стоп был в районе 490-й строки < except Application.Handle Exception...> - заменил except ; // Application... и т.д. Исключением пришлось пожертвовать. Далее остались только предупреждающие сообщения (Warning) - однотипные, около 16 штук.
После сборки в закладке Samples появился значок компонента BComPort. Я, разумеется, упустил моменты "принуждения ХЕ4 к лояльности"; через это, я думаю, проходит каждый пользователь. А у меня "навыков вождения" этого роллс-ройса не так уж много. Думаю, у вас практики больше.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
20.10.2016, 08:13  [ТС]
Создал новый Package (File->New->Package C++Builder). Добавил в него файл BCPort.pas (Project->Add to project...). При добавлении в проект автоматически добавился файл BCPort.dcr. Далее сделал Project->Make и... получил такую ошибку:
Pascal
1
2
3
4
5
6
7
unit BCPort; // Тут ошибка [DCC Fatal Error] BCPort.pas(14): F1027 Unit not found: 'System' or binary equivalents (.dcu)
 
interface
 
uses
  Windows, Messages, SysUtils, Classes;
...

А если сделать не Make, а Build, то возникает ошибка, которую я уже приводил:
Pascal
1
2
3
4
5
program pasall; // Тут ошибка [DCC Fatal Error] pasall.tmp(1): F1027 Unit not found: 'System' or binary equivalents
uses
  BCPort in 'BCPort.pas';
begin
end.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
20.10.2016, 10:47
Может, у вас ХЕ8 установлен только в С++ варианте (без Delphi) ?

Добавлено через 12 минут
Вообще, если буквально, я создал новый пакет с единственным компонентом: NewLabel и убедился, что проект компилируется и новый (NewLabel) компонент появляется в закладке System. Уже после этого добавил в проект BCPort.pas и удалил NewLabel.cpp. (Если это что-то меняет).
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
20.10.2016, 12:29  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
Может, у вас ХЕ8 установлен только в С++ варианте (без Delphi) ?
Да. У меня без Delphi. Но насколько я знаю, это не может быть причиной.
Вы как создавали пакет? Через File->New или Component->New Component?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.10.2016, 12:29
Помогаю со студенческими работами здесь

Чтение данных с COM-порта
Добрый день. Помогите пожалуйста. Я подаю команду, чтобы поменялись цифры на приборе и нужно чтобы эти цифры отобразились у меня в...

Чтение данных с COM порта
Есть два оборудования которые между собой подключены через COM. Одно все время передает данные другому. Хочу данные перехватить. Написал...

Чтение данных с COM порта
Доброго времени, установил javax.comm,в документации указано что: &gt;The javax.comm.properties file must be installed. If it is not, no...

Чтение данных из COM порта
Добрый день. Требуется написать программу для чтения данных из ком порта на Visual c++ 6.0. Собственно говоря, у меня получилось объявить...

Чтение данных с COM-порта
Здравствуйте. В ответ на мои запросы, COM порт присылает мне ответ различной длины. Как прочитать полностью то, что он прислал? Я хотел...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru