Com порт в асинхронном режиме на Visual C++ MFC

Com порт в асинхронном режиме на Visual C++ MFCПервый пост данного раздела посвящен COM порту и асинхронному режиму приема передачи данных по COM порту.  Асинхронный режим COM порта примечателен тем, что позволяет принимать для дальнейшей обработки данные побайтно, что в свою очередь дает возможность работать с пакетами байт переменной длины.

Допустим стоит задача принять на COM порт пакет данных количеством от 800 до 4000 байт с последующим ответом в 128 байт с периодом обмена данными 1 секунда. Начало пакета имеет синхробайты 0xA1 0xA2. Как нельзя лучше для такой задачи подойдет асинхронный режим. Запустить такой режим можно в потоке используя известные функции работы с COM портом. Ниже по тексту представлен небольшой проект Visual Studio MFC в котором данная задача решена используя всего одну нить или проще говоря поток. Архив с проектом для Visual Sdudio 2008 (MFC) в конце данного поста. Тестирование осуществляется с помощью общеизвестной бесплатной программы монитора COM порта ComPortToolkit.

Тестирование работы COM порта в асинхронном режиме

В архиве с проектом имеется текстовый файл MFCtest.txt в котором записана строка из 850 байт информации передаваемой на COM порт. Для тестирования необходимо чтобы на ПК имелось как минимум 2 COM порта соединенных перекрестным кабелем (выход одного COM подан на вход другого).


После запуска программы ComPortToolkit настраивается номер COM порта из которого будет отправляться сообщение, скрость обмена в бодах и настраивается отправка сообщения с указанием файла в котором находится строка из 850 байт информации. Кликаем по кнопке Send - начнется отправка.

Далее в среде Visual Studio открываем проект MFCtest и компилируем. После запуска программы устанавливаем COM порт на который будет приходить сообщение из ComPortToolkit, выбираем из выпадающего списка скорость обмена в бодах, которая должна быть такой-же как и в ComPortToolkit, устанавливаем птицу в чекбоксе 'Управление вкл./выкл.' и кликаем по кнопке 'Старт'. Начнется обмен сообщениями между двумя программами. Ну пока собственно и все. Приложение имеет несколько специфических органов управления предназначенных для изменения данных в пакете управления из 128 байт.  Просматривая код программы можно уяснить основные моменты как все работает.

Один нюанс. Дело в том, что вход в функцию потока приема-передачи операционная система на разных ПК, будет осуществлять по разному. Имеется ввиду то, что цикл входа в поток на разных ПК будет иметь разный период в зависимости от скоростных характеристик самого ПК. Это означает, что в буфере приема при каждом очередном входе в поток может быть как один байт, так и несколько. Поэтому для того, чтобы не нарушался обмен необходимо правильно выставлять задерку приема в выпадающем списке 'Задержка', которая даст возможность подождать пока в приемный буфер будет загружен весь непрерывный пакет инфрмации передаваемый из ComPortToolkit. Для скорости обмена в 115200 бод и длины строки приема в 850 байт достаточна задержка в 100 мс. Можно обойтись и без задержки. Тогда программу, при необходимости, вполне можно модифицировать на прием информации порциями появляющимися в приемном буфере при каждом входе в функцию потока, с накоплением данных  в отдельном буфере и формированием ответа по появлению в приемном буфере заранее известных конечных символов принимаемого пакета данных. Дерзайте...

Скачать проект обмена по COM порту MFCtest

Добавить комментарий:

Перейти и растаять в своей любимой социалке