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

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

18.10.2016, 11:21. Показов 9582. Ответов 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
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.10.2016, 15:20
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от nick42 Посмотреть сообщение
еще ReadStr, ReadStrAsync etc.,
Их переписывать надо под AnsiString.

C++
1
2
3
4
5
6
7
8
9
10
11
//---------------------------------------------------------------------------
void __fastcall  TForm1::Recive(TObject* Sender, int Count)
{
    AnsiString buffer;
    buffer.SetLength(Count);
 
    FBComPort->Read( (void*)&buffer[1], Count);
 
    RichEdit1->Lines->Add(buffer);
}
//---------------------------------------------------------------------------
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
20.10.2016, 15:46  [ТС]
Avazart, nick42, как я понимаю, у вас получилось использовать компонент без установки. Покажите как...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.10.2016, 15:47
Цитата Сообщение от d7d1cd Посмотреть сообщение
Avazart, nick42, как я понимаю, у вас получилось использовать компонент без установки. Покажите как...
Я же выложил код, и для кого это было сделано и разжовано?
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
20.10.2016, 15:50  [ТС]
А где взять файл BCPort.hpp? Или это переименованный файл BCPort.pas?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.10.2016, 15:55
d7d1cd, Среда с генирирует при первой компиляции, главное BCPort.pas добавить в проект.

nick42, В общем попробовал на моем "ИК-пульте на ардуине" и бегло просмотрел код - работает и код нормальный.
Синхронизация не нужна ибо читается непосредственно в указанный буфер из текущего потока.
События организованы через фиктивное окно и сист. очередь.

Но мне все же по душе работать не через "события" а через "таймауты", и самому выносить в поток, так в большинстве случаем более оптимально ибо можно в том же вторичном потоке сделать обработку принятых данных (не нагружая ей GUI)
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
20.10.2016, 16:00
Цитата Сообщение от d7d1cd Посмотреть сообщение
как я понимаю, у вас получилось использовать компонент без установки
Получилось у Avazart'a, я еще недоустановил среду... .
Вообще, общий принцип такой: добавляете к проекту pas-файл; если он не проблемный, то после его компиляции создаются файлы .hpp и .obj (можно переименовать в .lib). Вот этот .hpp нужно включить в свой C++ проект, и тогда все функции компонента станут доступны. Правда, самого визуального компонента вы не увидите на палитре, и доступ к свойствам будет без привычного комфорта. Но, как говорится, на безрыбьи и это бонус!

Добавлено через 4 минуты
Avazart, спасибо за помощь. Насчет макроса я бы не догадался; смотрел совсем в другую сторону... .
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
20.10.2016, 16:00  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Среда с генирирует при первой компиляции, главное BCPort.pas добавить в проект.
Создал проект (одна форма). Добавил в этот проект файл BCPort.pas. Делаю компиляцию - ошибка [DCC Fatal Error] BCPort.pas(14): F1027 Unit not found: 'System' or binary equivalents (.dcu).
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.10.2016, 16:03
Цитата Сообщение от d7d1cd Посмотреть сообщение
Создал проект (одна форма). Добавил в этот проект файл BCPort.pas. Делаю компиляцию - ошибка [DCC Fatal Error] BCPort.pas(14): F1027 Unit not found: 'System' or binary equivalents (.dcu).
Какая версия IDE ? Delphi в ней установлен помимо C++Builder?

Если что-то из самых последних то там может быть Vcl.System или что вроде того...
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
20.10.2016, 16:05  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Какая версия IDE ? Delphi в ней установлен помимо C++Builder?
Версия среды XE8, установлен только C++ Builder.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.10.2016, 16:07
Цитата Сообщение от nick42 Посмотреть сообщение
Avazart, спасибо за помощь. Насчет макроса я бы не догадался; смотрел совсем в другую сторону... .
Так там других сторон то нет ->Port= "COM5" вызывает метод SetPort(), который почему-то кроет какой-то макрос С++.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
20.10.2016, 16:38  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Если что-то из самых последних то там может быть Vcl.System или что вроде того...
У меня хидеры с Vcl.. Только я все равно не пойму как обойти ошибку...

Добавлено через 7 минут
Если не трудно и не жалко, то выложите сюда, пожалуйста, файл BCPort.hpp.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.10.2016, 17:18
Цитата Сообщение от d7d1cd Посмотреть сообщение
У меня хидеры с Vcl.. Только я все равно не пойму как обойти ошибку...
Вы поправили их? в BCPort.pas ?

У меня XE3.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
21.10.2016, 08:20  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Вы поправили их? в BCPort.pas ?
Вы имеете ввиду эти строки:
Pascal
1
2
uses
  Windows, Messages, SysUtils, Classes;
Правил, но ошибка не меняется: делаю Make проекта, система выделяет строку unit BCPort; и сообщает об ощибке [DCC Fatal Error] BCPort.pas(14): F1027 Unit not found: 'System' or binary equivalents (.dcu).

В архиве, который предоставил nick42, есть файл BCPort.hpp. Я добавил его в проект, добавил Ваш (Avazart) макрос и попробовал создать объект типа TBComPort. Естественно, при линковке я получил ошибку Unresolved external...? ведь в том BCPort.hpp есть только описание функций, но нет реализации. Компиляция файла BCPort.pas создаст какой-то другой hpp файл?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.10.2016, 09:45
Цитата Сообщение от d7d1cd Посмотреть сообщение
Компиляция файла BCPort.pas создаст какой-то другой hpp файл?
Компиляция файла BCPort.pas создаст кроме всего прочего файлы BCPort.hpp и BCPort.obj, - вот этот .obj и нужно подключить к своему проекту, чтобы линковщик успокоился.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
21.10.2016, 10:03  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
BCPort.hpp и BCPort.obj, - вот этот .obj и нужно подключить к своему проекту, чтобы линковщик успокоился.
Теперь ясно. Остается вопрос как получить эти файлы из файла BCPort.pas, если среда отказывается его компилировать...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.10.2016, 11:43
Цитата Сообщение от nick42 Посмотреть сообщение
вот этот .obj и нужно подключить к своему проекту, чтобы линковщик успокоился.
Он должен сам подтягиваться. И вероятно стоит ставить Delphi+Builder.

Цитата Сообщение от d7d1cd Посмотреть сообщение
Вы имеете ввиду эти строки:
Какие буквы непонятны в моем посте:
Цитата Сообщение от Avazart Посмотреть сообщение
Вы поправили их? в BCPort.pas ?
Цитата Сообщение от d7d1cd Посмотреть сообщение
В архиве, который предоставил nick42, есть файл BCPort.hpp. Я добавил его в проект, добавил Ваш (Avazart) макрос и попробовал создать объект типа TBComPort. Естественно, при линковке я получил ошибку Unresolved external...? ведь в том BCPort.hpp есть только описание функций, но нет реализации. Компиляция файла BCPort.pas создаст какой-то другой hpp файл?
Вы смело игнорируете что вам советуют и пишут, что же ничем не могу помочь.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
21.10.2016, 11:52  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Вы смело игнорируете что вам советуют и пишут
Если Вы не обратили внимания, то я как раз не игнорирую, ибо было сказано:
Цитата Сообщение от d7d1cd Посмотреть сообщение
Правил, но ошибка не меняется: делаю Make проекта, система выделяет строку unit BCPort; и сообщает об ощибке [DCC Fatal Error] BCPort.pas(14): F1027 Unit not found: 'System' or binary equivalents (.dcu).
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.10.2016, 12:08
Цитата Сообщение от d7d1cd Посмотреть сообщение
Если Вы не обратили внимания, то я как раз не игнорирую, ибо было сказано:
Вам четко сказали что hpp должен создаваться средой автоматически, что не понятно?
Что доставить Delphi такая проблема?
На ошибку я указал что возможно нужно поправить users.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.10.2016, 13:21
d7d1cd, в архиве "пакет" с этим компонентом для ХЕ8. Там еще я добавил небольшой тестовый проект для проверки приема-передачи по ком-порту; его я тоже перетащил с BCB5 на ХЕ8. Если установить пару виртуальных портов, то можно передавать с одного, а принимать на другой порт.
Компонент можно установить так: Components - Add component и указать на файл Package2.bpl (Package2.lib тоже разместить в штатной папке, ну или добавить к своему проекту в крайнем случае). После установки во вкладке Samples должен появиться значок компонента BComPort. Спрашивайте, если что непонятно.
Вложения
Тип файла: zip comport.zip (509.4 Кб, 12 просмотров)
2
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.10.2016, 13:36
P.S. Этот ХЕ8 устанавливался целых 4 часа!!.... Благо, у меня на работе есть ресурс для подобных экспериментов.
Я устанавливал весь пакет "по умолчанию", то-есть и Delphi, и С++, со всеми плюшками. Ваших ошибок у меня не возникло, а появились те, о которых я писал ранее (т.е. uses Forms и Application.Excep...). Может быть компонент в этой студии и работает в урезанном варианте, но уже то, что с его помощью удалось скомпилировать примитив по работе блоками с ком-портами, свидетельствует о его работоспособности.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.10.2016, 13:36

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru