Перейти к содержанию
    

Общение МК с программой через COM в С++Builder

Всем привет. В C++Builder Начал делать программку с формами под win и столкнулся с проблемой использования СОМ порта. Прошерстил интернет, но все найденное(примеры,статьи) применимо к консольным приложениям. Как организовать выбор, инициализацию и чтение-запись порта с формы? Интуитивно понимаю что нужно использовать какие нибудь потоки, но... я новичок в этом. Подскажите, где можно посмотреть, почитать о такой реализации? Программа принимает от контроллера число угла 0-360 по одному числу(сотни,десятки,единицы) и символ 0х0D означающий конец передачи. По заданному углу рисуется стрелка на карте. При клике мышкой на любом месте карты рисуется стрелка в эту точку и новый угол передается контроллеру(так же по одному числу). Порт выбирается из ComboBox из действующих портов, на Lable выводятся ошибки настройки и подключения порта. С графикой проблем не возникло, остановился на работе с портом. Подскажите как реализовать общение с МК.

Во вложении файлы проекта С++Builder

Povorot.rar

Screenshot-23_02.2020_17_24.41269.thumb.jpg.d3db80d0e298e1450208c6fded7fadf0.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А консольная программа или GUI разницы нет, как с портом работать. На чтение (может и на запись, если большой объём) порта  да надо или отдельный поток, чтобы не тормозило или назначить Application->OnIdle функцию которая периодически будет асинхронное чтение запускать и проверять его окончание

https://docs.microsoft.com/en-us/windows/win32/fileio/synchronous-and-asynchronous-i-o

В случае асинхоронных операций, не нужны будут многозадачные заморочки с мьютексами для синхронизации доступа к данным из разных потоков

Изменено пользователем gridinp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

33 минуты назад, AlexDX740 сказал:

В C++Builder Начал делать программку с формами под win и столкнулся с проблемой использования СОМ порта. Прошерстил интернет, но все найденное(примеры,статьи) применимо к консольным приложениям.

Неправильно как-то шерстил:-) Для дельфи/буилдера всё делается через компоненты. Соответственно, для работы с портом надо искать соответствующий компонент. Типа TComPort.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Функции не привязанные к обработке каких либо событий не выполняются, а к какому событию я могу привязать чтение порта, если оно нужно постоянно? Настройку порта, подключение я могу привязать к кнопке, передачу я могу привязать к клику мышки, а вот чтение... 

12 minutes ago, AHTOXA said:

Неправильно как-то шерстил:-) Для дельфи/буилдера всё делается через компоненты. Соответственно, для работы с портом надо искать соответствующий компонент. Типа TComPort.

Так что то не нашел. Есть DCOMConection но насколько я понял это совсем не то

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, AlexDX740 said:

Так что то не нашел.

В приложении небольшой пример проекта на С++ Builder 6, может Вам подойдет. Я подключаю МК STM32 к компьютеру через конвертер USB-UART. Есть еще аналогичные программы на C++ и C#. По работе приходилось их часто писать.

Rs232_c.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, gridinp сказал:

чтобы не тормозило или назначить Application->OnIdle функцию которая периодически будет асинхронное чтение запускать и проверять его окончание

...и обмен по порту будет зависеть от уровня загрузки операциями рисования GUI. И будет глючить и тормозить этот обмен, стоит только просто быстро поразворачивать-сворачивать окошки.

Совмещать реалтайм операции с железом (в том числе COM-портами) с обработкой юзер-интерфейса - безграмотно. Такие операции по уму выносят в отдельный (от юзер-интерфейса) поток.

3 часа назад, gridinp сказал:

В случае асинхоронных операций, не нужны будут многозадачные заморочки с мьютексами для синхронизации доступа к данным из разных потоков

Какие там заморочки? Пара Interlocked-функций (для очередей межпоточного обмена) и один Event-объект (SetEvent()/WaitForSingleObject())  - это "заморочки"?  :unknw:

3 часа назад, AlexDX740 сказал:

Так что то не нашел. Есть DCOMConection но насколько я понял это совсем не то

Читать в MSDN про WriteFile()/ReadFile()/SetupComm()/GetCommState()/SetCommState() и иже с ними. Также читать про многопоточное программирование.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Serhiy_UA said:

В приложении небольшой пример проекта на С++ Builder 6

Посмотрел. Получается вы просто функцию чтения вставили в функцию таймера. А если МК раньше начнет передачу, данные не потеряются?

36 minutes ago, kovigor said:

Эту статью я сразу нашел. С настройкой порта и таймингов проблем нет, я просто не понимал в какой поток это приткнуть. В МК это все попроще делать, а здесь такие заморочки. Я и сейчас не понимаю как по принципу флагов в регистрах в МК реализовать постоянное ожидание и чтение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, AlexDX740 said:

Посмотрел. Получается вы просто функцию чтения вставили в функцию таймера. А если МК раньше начнет передачу, данные не потеряются?

Потерь не замечал. Этот пример простой, в других случаях и скорость выше, и объемы больше. Аналогичный метод приема c UART и на стороне МК, только там таймер от 200 до 1000 Гц. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какие таймеры? Какое WinAPI?! Это же билдер! Здесь всё делается так: на форму кидается компонент TComPort, и пишется обработчик его события OnDataAvailable, где принятые данные считываются и обрабатываются :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 minutes ago, AHTOXA said:

Какие таймеры? Какое WinAPI?! Это же билдер! Здесь всё делается так: на форму кидается компонент TComPort, и пишется обработчик его события OnDataAvailable, где принятые данные считываются и обрабатываются :-)

Вот с этим как раз и были проблемы. Не мог никак поставить ComPort Library. Постоянные ошибки и пр. А на голом билдере таких компонентов нет. Сейчас появились и думаю проблема будет решена. За то узнал много полезного и лучше стал понимать работу с портом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

57 minutes ago, AlexDX740 said:

Вот с этим как раз и были проблемы. Не мог никак поставить ComPort Library. Постоянные ошибки и пр. А на голом билдере таких компонентов нет. Сейчас появились и думаю проблема будет решена. За то узнал много полезного и лучше стал понимать работу с портом.

Ставьте лучше AsyncPro. Это стандартный компонент из бесплатного набора дополнительных библиотек и даже триальный билдер дает качать его прямо из своей IDE.
Он сам создает нужные потоки сколько их там требуется.
У компонента есть назначаемые события вызываемые в основном оконном потоке сразу по приему данных.
Никаких задержек на таймера, задержка только на прохождение ивента от потока в окно приложения через  сервисы windows.
Но GUI не тормозится поскольку пропуск ивента не грозит потерей данных, они буферизируются в отдельных потоках либы AsyncPro.   

Но самый писк нынче вообще не связываться с COM портом.
Ставьте в микроконтроллер библиотеку FreeMaster, на компе подключаете их dll и получаете универсальный канал связи и одновременно протокол.  
Работает через COM, CAN, SWD, Ethernet, интернет, WEB и т.д. 
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, AlexandrY said:

Но самый писк нынче вообще не связываться с COM портом.

 

Не, для моего уровня USART и СОМ это потолок))) Да и для передачи числа от 0 до 360 я думаю не стоит уж так заморачиваться.

AsyncPro попробую поставить и реализовать. Не подскажете где можно почитать про компоненты и их события?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

AsyncPro не советую - очень старая кодовая база, очень всё запутано и сложно. Они начали делать свой набор компонентов чуть ли не под винду 3.0, и потом наворачивали слои. Пытались унифицировать работу через ком-порт, через модем, через сеть. Потому и выбросили в опенсорс (раньше были платными) - получился монстр.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...