Com порт в асинхронном режиме на Visual C++ MFC
Первый пост данного раздела посвящен COM порту и асинхронному режиму приема передачи данных по COM порту. Асинхронный режим COM порта примечателен тем, что позволяет принимать для дальнейшей обработки данные побайтно, что в свою очередь дает возможность работать с пакетами байт переменной длины.
Допустим стоит задача принять на COM порт пакет данных количеством от 800 до 4000 байт с последующим ответом в 128 байт с периодом обмена данными 1 секунда. Начало пакета имеет синхробайты 0xA1 0xA2. Как нельзя лучше для такой задачи подойдет асинхронный режим. Запустить такой режим можно в потоке используя известные функции работы с COM портом. Ниже по тексту представлен небольшой проект Visual Studio MFC в котором данная задача решена используя всего одну нить или проще говоря поток. Архив с проектом для Visual Sdudio 2008 (MFC) в конце данного поста. Тестирование осуществляется с помощью общеизвестной бесплатной программы монитора COM порта ComPortToolkit.
В архиве с проектом имеется текстовый файл MFCtest.txt в котором записана строка из 850 байт информации передаваемой на COM порт. Для тестирования необходимо чтобы на ПК имелось как минимум 2 COM порта соединенных перекрестным кабелем (выход одного COM подан на вход другого).
После запуска программы ComPortToolkit настраивается номер COM порта из которого будет отправляться сообщение, скрость обмена в бодах и настраивается отправка сообщения с указанием файла в котором находится строка из 850 байт информации. Кликаем по кнопке Send - начнется отправка.
Далее в среде Visual Studio открываем проект MFCtest и компилируем. После запуска программы устанавливаем COM порт на который будет приходить сообщение из ComPortToolkit, выбираем из выпадающего списка скорость обмена в бодах, которая должна быть такой-же как и в ComPortToolkit, устанавливаем птицу в чекбоксе 'Управление вкл./выкл.' и кликаем по кнопке 'Старт'. Начнется обмен сообщениями между двумя программами. Ну пока собственно и все. Приложение имеет несколько специфических органов управления предназначенных для изменения данных в пакете управления из 128 байт. Просматривая код программы можно уяснить основные моменты как все работает.
Один нюанс. Дело в том, что вход в функцию потока приема-передачи операционная система на разных ПК, будет осуществлять по разному. Имеется ввиду то, что цикл входа в поток на разных ПК будет иметь разный период в зависимости от скоростных характеристик самого ПК. Это означает, что в буфере приема при каждом очередном входе в поток может быть как один байт, так и несколько. Поэтому для того, чтобы не нарушался обмен необходимо правильно выставлять задерку приема в выпадающем списке 'Задержка', которая даст возможность подождать пока в приемный буфер будет загружен весь непрерывный пакет инфрмации передаваемый из ComPortToolkit. Для скорости обмена в 115200 бод и длины строки приема в 850 байт достаточна задержка в 100 мс. Можно обойтись и без задержки. Тогда программу, при необходимости, вполне можно модифицировать на прием информации порциями появляющимися в приемном буфере при каждом входе в функцию потока, с накоплением данных в отдельном буфере и формированием ответа по появлению в приемном буфере заранее известных конечных символов принимаемого пакета данных. Дерзайте...
Скачать проект обмена по COM порту MFCtest
Электроника :
- Техника электроника (11)
- Полезная электроника (4)
- Электроника для всех (5)
- Техника для дома (6)
- Cхемотехника ПЛИС (11)
- Пректирование PCAD (4)
Программирование :
- Микроконтроллеры (9)
- ПЛИС VHDL Verilog (29)
- C++ Builder (7)
- Visual Studio C++ C# (7)
- Java programming (7)
- Matlab programming (4)
Сайтостроение :
- Сайтостроение HTML (5)
- Сайтостроение PHP (8)
- PHP CMS на файлах (3)
- Web инструменты (9)
- Полезное вебмастеру (11)
- SEO раскрутка сайта (4)
- PHP скрипты (3)
Реклама :
Книги и учебники :
- Шаблоны сайтов (6)
- Книги и учебники (2)
Компьютер и интернет :
Поиск по сайту :
Реклама :
Облако меток :
Бесплатная подписка :
Статистика :
- Популярность (3)
- Посещаемость (3)
- Поисковые запросы (3)