|
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
|
|
| 18.10.2016, 11:21 | |
|
Ответы с готовыми решениями:
60
Асинхронное чтение из COM-порта Асинхронное чтение последовательного порта. MVVM Чтение данных с COM-порта |
|
Практикантроп
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
|
|
|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
||
| 18.10.2016, 16:38 | ||
|
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:
0
|
||||||
|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
||
| 19.10.2016, 10:12 | ||
|
0
|
||
|
Практикантроп
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 [ТС] | |||
|
0
|
|||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 19.10.2016, 11:54 [ТС] | |
|
0
|
|
|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
|
| 19.10.2016, 12:01 | |
|
Посетите ТОРРИ.НЕТ , подраздел Communications; там и бесплатных несколько есть. А для ХЕ8 - только шароварные
0
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|||||||
| 19.10.2016, 13:48 [ТС] | |||||||
|
Итак, вернемся к вопросу об асинхронном чтении данных из COM порта. Но сначала порт нужно открыть так, чтобы функции чтения и записи могли работать в асинхронном режиме. COM порт с именем в PortName открываю так:
Добавлено через 17 минут Не могу разобраться как использовать функции GetOverlappedResult, WaitCommEvent, WaitForSingleObject и нужны ли они все в моем случае.
0
|
|||||||
|
Практикантроп
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 [ТС] | |
|
0
|
|
|
Практикантроп
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 и... получил такую ошибку:
А если сделать не Make, а Build, то возникает ошибка, которую я уже приводил:
0
|
|||||||||||
|
Практикантроп
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 [ТС] | ||
|
Вы как создавали пакет? Через File->New или Component->New Component?
0
|
||
| 20.10.2016, 12:29 | |
|
Помогаю со студенческими работами здесь
20
Чтение данных с COM-порта Чтение данных с COM порта Чтение данных с COM порта Чтение данных из COM порта Чтение данных с COM-порта Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Переходник 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 и. . .
|