AlexDX740 0 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба Всем привет. В C++Builder Начал делать программку с формами под win и столкнулся с проблемой использования СОМ порта. Прошерстил интернет, но все найденное(примеры,статьи) применимо к консольным приложениям. Как организовать выбор, инициализацию и чтение-запись порта с формы? Интуитивно понимаю что нужно использовать какие нибудь потоки, но... я новичок в этом. Подскажите, где можно посмотреть, почитать о такой реализации? Программа принимает от контроллера число угла 0-360 по одному числу(сотни,десятки,единицы) и символ 0х0D означающий конец передачи. По заданному углу рисуется стрелка на карте. При клике мышкой на любом месте карты рисуется стрелка в эту точку и новый угол передается контроллеру(так же по одному числу). Порт выбирается из ComboBox из действующих портов, на Lable выводятся ошибки настройки и подключения порта. С графикой проблем не возникло, остановился на работе с портом. Подскажите как реализовать общение с МК. Во вложении файлы проекта С++Builder Povorot.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gridinp 2 24 февраля, 2020 Опубликовано 24 февраля, 2020 (изменено) · Жалоба А консольная программа или GUI разницы нет, как с портом работать. На чтение (может и на запись, если большой объём) порта да надо или отдельный поток, чтобы не тормозило или назначить Application->OnIdle функцию которая периодически будет асинхронное чтение запускать и проверять его окончание https://docs.microsoft.com/en-us/windows/win32/fileio/synchronous-and-asynchronous-i-o В случае асинхоронных операций, не нужны будут многозадачные заморочки с мьютексами для синхронизации доступа к данным из разных потоков Изменено 24 февраля, 2020 пользователем gridinp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба 33 минуты назад, AlexDX740 сказал: В C++Builder Начал делать программку с формами под win и столкнулся с проблемой использования СОМ порта. Прошерстил интернет, но все найденное(примеры,статьи) применимо к консольным приложениям. Неправильно как-то шерстил:-) Для дельфи/буилдера всё делается через компоненты. Соответственно, для работы с портом надо искать соответствующий компонент. Типа TComPort. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexDX740 0 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба Функции не привязанные к обработке каких либо событий не выполняются, а к какому событию я могу привязать чтение порта, если оно нужно постоянно? Настройку порта, подключение я могу привязать к кнопке, передачу я могу привязать к клику мышки, а вот чтение... 12 minutes ago, AHTOXA said: Неправильно как-то шерстил:-) Для дельфи/буилдера всё делается через компоненты. Соответственно, для работы с портом надо искать соответствующий компонент. Типа TComPort. Так что то не нашел. Есть DCOMConection но насколько я понял это совсем не то Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба 7 minutes ago, AlexDX740 said: Так что то не нашел. В приложении небольшой пример проекта на С++ Builder 6, может Вам подойдет. Я подключаю МК STM32 к компьютеру через конвертер USB-UART. Есть еще аналогичные программы на C++ и C#. По работе приходилось их часто писать. Rs232_c.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба 3 часа назад, gridinp сказал: чтобы не тормозило или назначить Application->OnIdle функцию которая периодически будет асинхронное чтение запускать и проверять его окончание ...и обмен по порту будет зависеть от уровня загрузки операциями рисования GUI. И будет глючить и тормозить этот обмен, стоит только просто быстро поразворачивать-сворачивать окошки. Совмещать реалтайм операции с железом (в том числе COM-портами) с обработкой юзер-интерфейса - безграмотно. Такие операции по уму выносят в отдельный (от юзер-интерфейса) поток. 3 часа назад, gridinp сказал: В случае асинхоронных операций, не нужны будут многозадачные заморочки с мьютексами для синхронизации доступа к данным из разных потоков Какие там заморочки? Пара Interlocked-функций (для очередей межпоточного обмена) и один Event-объект (SetEvent()/WaitForSingleObject()) - это "заморочки"? 3 часа назад, AlexDX740 сказал: Так что то не нашел. Есть DCOMConection но насколько я понял это совсем не то Читать в MSDN про WriteFile()/ReadFile()/SetupComm()/GetCommState()/SetCommState() и иже с ними. Также читать про многопоточное программирование. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба https://e-libra.ru/read/193452-rabota-s-com-i-lpt-v-win32.html Классика ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexDX740 0 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба 2 hours ago, Serhiy_UA said: В приложении небольшой пример проекта на С++ Builder 6 Посмотрел. Получается вы просто функцию чтения вставили в функцию таймера. А если МК раньше начнет передачу, данные не потеряются? 36 minutes ago, kovigor said: https://e-libra.ru/read/193452-rabota-s-com-i-lpt-v-win32.html Классика ... Эту статью я сразу нашел. С настройкой порта и таймингов проблем нет, я просто не понимал в какой поток это приткнуть. В МК это все попроще делать, а здесь такие заморочки. Я и сейчас не понимаю как по принципу флагов в регистрах в МК реализовать постоянное ожидание и чтение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба Just now, AlexDX740 said: Посмотрел. Получается вы просто функцию чтения вставили в функцию таймера. А если МК раньше начнет передачу, данные не потеряются? Потерь не замечал. Этот пример простой, в других случаях и скорость выше, и объемы больше. Аналогичный метод приема c UART и на стороне МК, только там таймер от 200 до 1000 Гц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба Какие таймеры? Какое WinAPI?! Это же билдер! Здесь всё делается так: на форму кидается компонент TComPort, и пишется обработчик его события OnDataAvailable, где принятые данные считываются и обрабатываются :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexDX740 0 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба 18 minutes ago, AHTOXA said: Какие таймеры? Какое WinAPI?! Это же билдер! Здесь всё делается так: на форму кидается компонент TComPort, и пишется обработчик его события OnDataAvailable, где принятые данные считываются и обрабатываются :-) Вот с этим как раз и были проблемы. Не мог никак поставить ComPort Library. Постоянные ошибки и пр. А на голом билдере таких компонентов нет. Сейчас появились и думаю проблема будет решена. За то узнал много полезного и лучше стал понимать работу с портом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 2 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба 57 minutes ago, AlexDX740 said: Вот с этим как раз и были проблемы. Не мог никак поставить ComPort Library. Постоянные ошибки и пр. А на голом билдере таких компонентов нет. Сейчас появились и думаю проблема будет решена. За то узнал много полезного и лучше стал понимать работу с портом. Ставьте лучше AsyncPro. Это стандартный компонент из бесплатного набора дополнительных библиотек и даже триальный билдер дает качать его прямо из своей IDE. Он сам создает нужные потоки сколько их там требуется. У компонента есть назначаемые события вызываемые в основном оконном потоке сразу по приему данных. Никаких задержек на таймера, задержка только на прохождение ивента от потока в окно приложения через сервисы windows. Но GUI не тормозится поскольку пропуск ивента не грозит потерей данных, они буферизируются в отдельных потоках либы AsyncPro. Но самый писк нынче вообще не связываться с COM портом. Ставьте в микроконтроллер библиотеку FreeMaster, на компе подключаете их dll и получаете универсальный канал связи и одновременно протокол. Работает через COM, CAN, SWD, Ethernet, интернет, WEB и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexDX740 0 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба 1 hour ago, AlexandrY said: Но самый писк нынче вообще не связываться с COM портом. Не, для моего уровня USART и СОМ это потолок))) Да и для передачи числа от 0 до 360 я думаю не стоит уж так заморачиваться. AsyncPro попробую поставить и реализовать. Не подскажете где можно почитать про компоненты и их события? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба AsyncPro не советую - очень старая кодовая база, очень всё запутано и сложно. Они начали делать свой набор компонентов чуть ли не под винду 3.0, и потом наворачивали слои. Пытались унифицировать работу через ком-порт, через модем, через сеть. Потому и выбросили в опенсорс (раньше были платными) - получился монстр. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 2 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба Делал пару лет назад на C# - там свои особенности, но в целом работало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться