- •Пояснительная записка к курсовой работе
- •Оглавление
- •1. Постановка задачи.
- •1.1. Стандартное задание
- •1.2. Индивидуальное задание
- •2. Техническое задание
- •3. Описание аппаратных и программных средств лабораторного комплекса
- •3.1. Структура аппаратных средств
- •3.1.1. Структурная схема лабораторного комплекса
- •3.1.2. Плата мк – системы
- •3.1.2.1. Конфигурируемые узлы мк c8051f064
- •Интерфейс прямого доступа к памяти (dma)
- •3.1.2.2. Внешняя память xram
- •3.1.2.3. Входные усилители
- •3.1.2.4. Микросхема моста uart-usb
- •3.1.2.5. Сопряжение платы с pc
- •3.1.2.6. Питание платы
- •3.1.3. Требования к pc
- •3.1.4. Осциген
- •. Перечень программных средств лабораторного комплекса
- •Средства программирования и отладки мк-системы
- •Интегрированная среда разработки фирмы SiLabs ide 2.0
- •3.2.1.2. Ассемблер, компилятор и линкер интегрированной среды разработки Keil
- •3.2.2. Средства разработки Windows-приложений
- •3.2.2.1. Среда разработки
- •3.2.2.2. Библиотека win32 api функций
- •3.2.3. Приложения для осцигеНа.
- •3.2.3.1. Драйвер конфигурируемого выносного блока
- •3.2.3.2. Windows-приложение ogView
- •3.2.4. Драйвер виртуального com-порта фирмы SiLabs
- •Организация бесконечного цикла встроенного приложения
- •Отключение сторожевого таймера
- •Переключение с внутреннего генератора на внешний
- •Конфигурирование портов ввода/вывода
- •Конфигурирование аналого-цифровых преобразователей adc
- •Конфигурирование интерфейса dma
- •Инициализация последовательного интерфейса uart
- •Выбор и инициализация таймера для установки скорости обмена данными по последовательному каналу
- •Инициализация таймера для установки времени дискретизации входного сигнала
- •Прием данных с pc
- •Другие используемые функции
- •Конфигурирование узлов мк с учетом данных, пришедших с pc
- •Разработка Windows-приложения
- •4.4.1. Особенности использования среды разработки
- •4.4.2. Описание файлов проекта
- •4.4.3. Обобщенная схема алгоритма многопоточного приложения
- •4.4.4. Внешний вид и описание графического интерфейса, принципы построения программы
- •Описание структуры и организация программы
- •4.4.5.1. Назначение подключаемых файлов
- •4.4.5.2. Описание прототипов функций
- •4.4.5.3. Функция WinMain()
- •4.4.5.4. Функция главного окна
- •4.4.5.5. Организация дополнительных потоков, их назначение
- •4.4.5.6. Рабочие функции дополнительных потоков
- •4.4.5.7. Синхронизация потоков
- •4.4.5.8. Особенности обработки сообщений Windows в программе
- •4.4.6.2. Организация настроек com-порта в графическом интерфейсе
- •4.4.6.3. Использование функций WaitCommEvent(), WaitForSingleObject(), WaitForMultiplyObject()
- •Работа оператора с приложением
- •4.4.7.1. Последовательность запуска приложения на мк и пк в лаборатории
- •4.4.7.2. Адаптация к спектру входного сигнала
- •Описание протокола rs-232
- •Список используемых источников информации
- •Приложения
- •Исходные тексты модулей программы для мк
- •Фрагменты листингов файлов мк-приложения, полученные в результате трансляций: map-file и др
- •Исходные тексты файлов Windows-приложения
Описание структуры и организация программы
4.4.5.1. Назначение подключаемых файлов
Программа не разбита на модули, поэтому из подключаемых файлов только stdafx.cpp, который добавляется по умолчанию. Их описание находится выше в пункте «Описание файлов проекта» (п.4.4.2).
4.4.5.2. Описание прототипов функций
В программе используются следующие функции:
int power(int,int); - функция возведения в степень, возводит первый аргумент в степень второго аргумента и возвращает результат;
void demo(void) – функция, которая вызывается при нажатии кнопки «Demo», заполняет буфер значениями синусоиды по умолчанию и посылает сообщение перерисовки графика.
bool scale(void) – функция, отвечающая за масштаб, считывает все введенные пользователем данные о масштабе и проверяет их
int start(void) - функция, которая вызывается при нажатии кнопки «Start», считывает введенные настройки, проверяет их, создает подключение к COM-порту, проверяет, готов ли порт к получению данных, создает поток для рисования графика.
int ConnectToCOM(HANDLE); - функция соединения с COM портом, реализует отправку и получение сигналов для установления соединения, после этого посылает микроконтроллеру через COM порт необходимые настройки, возвращает единицу если без ошибок, в противном случае ноль;
int Get_Res(HANDLE,unsigned char *); - функция получения результатов оцифровывания.
int pRead(HANDLE,unsigned char *); - функция чтения символа (байта) из буфер COM порта;
int pWrite(HANDLE,unsigned char); - функция записи символа (байта) в буфер COM порта;
4.4.5.3. Функция WinMain()
Программа состоит из функции инициализации, цикла сообщений Windows, функций обработки сообщений главного окна и потока, выполняемого параллельно с главным потоком.
Точкой входа в программу является функция WinMain(), которая регистрирует классы и вызывает функцию инициализации, в результате чего создается главное и дочерние окна. В конце функции WinMain находится бесконечный цикл по трансляции и обработке сообщений Windows. После трансляции сообщение передается в функцию обратного вызова соответствующего окна.
4.4.5.4. Функция главного окна
CallBack главного окна обрабатывает сообщение о выходе из приложения и реагирует на нажатие кнопки начала измерений.
4.4.5.5. Организация дополнительных потоков, их назначение
Помимо основного потока в программе используются еще один параллельный поток – осуществляет рисование графика на экране.
Поток создается приостановленным, и в случае получения данных от микроконтроллера возобновляется.
DataProcess_Thread=CreateThread(NULL,0,ThreadProcDraw,NULL,CREATE_SUSPENDED,NULL); - создание потока с функцией обработки ThreadProcDraw.
ResumeThread(DataProcess_Thread); - запуск потока при в случае пересылки данных.
4.4.5.6. Рабочие функции дополнительных потоков
Рабочая функция DWORD WINAPI ThreadProcDraw(LPVOID param) обслуживает поток. Она объединяет старший и младший байты полученного значения выборки в целое число и записывает его в буффер для прорисовки на экране.
4.4.5.7. Синхронизация потоков
Поскольку дополнительный поток возобновляется по указанию основного, т.е. в нужное время, то таким образом обеспечивается синхронизация дополнительного с основным потоком.
4.4.5.8. Особенности обработки сообщений Windows в программе
В программе предусмотрена обработка следующих сообщений главного окна (рис.4.6):
- WM_COMMAND – это сообщение используется для отслеживания нажатий на кнопки «Start» для инициализации обмена данными между МК и компьютером, нажатий на кнопки «Demo» для отображения демонстрационного варианта графика и кнопки «Exit» для выхода из приложения.
- WM_PAINT – это сообщение посылается, когда необходимо перерисовать графические элементы в окне. В нашем случае осуществляется прорисовка осей, сетки, а в случае получения данных и графика зависимости напряжения.
- WM_SIZE – сообщение посылается приложению при изменении размеров окна. В данном случае оно не используется, поскольку изменение размеров окна не предусмотрено.
- WM_SETFOCUS – это сообщение посылается окну, когда оно получило фокус клавиатуры.
- WM_DESTROY – высылается при завершении работы приложения.
- WM_CREATE – оконная процедура нового окна принимает это сообщение после того, как окно создано, но до того, как окно становится видимым.
Рис. 4.6. Схема алгоритма обработки сообщений
4.4.5.9. Функция рисования графика восстановленного сигнала
Функция рисования графика восстановленного сигнала (рис.4.7) называется ThreadProcDraw(LPVOID param) и она является дополнительным потоком в программе, она записывает данные в буфер для рисования графика ипосылает сообщение WM_Paint, при обработке которого рисуется график.
Рис. 4.7 Алгоритм работы функции рисования графика
4.4.5.10. Разметка осей графика
На каждой оси отмечается по 5 основных делений делений, каждое деление делится пополам второстепенным делением. По оси абсцисс отмечается время, минимальное значение которого может быть 0, а максимальное отмечается на оси. На оси ординат – значения напряжения, минимальное значение которого может быть 0, а максимальное отмечается на оси.
4.4.5.11. Использование контекстуальной памяти для рисования графика
Перед рисование графика данные, полученные от МК записываются в буфер и только при завершении считывания всех данных рисуются на экране.
Работа с COM-портом, описание WinAPI-функций и структур данных
4.4.6.1. Инициализация COM-порта, обоснование выбора режима (синхронный, асинхронный), объема буфера приема/передачи данных
COM-порты в Windows аналогичны файлам и могут быть задействованы с использованием тех же функций, что и файлы - CreateFile, ReadFile, WriteFile, CloseHandle. Однако в программе используются функции, специфичные для COM-порта в Win32 API – GetCommState, SetCommState.
Функция CreateFile открывает или создает файл, файловый поток, директорию, физический диск, раздел, консольный буфер или коммуникационный ресурс. В случае успеха функция возвращает хендл объекта для доступа к нему.
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
lpFileName – полное имя открываемого файла
dwDesiredAccess – доступ к объекту (чтение, запись или и то, и другое)
dwShareMode – режим разделения доступа к ресурсу
lpSecurityAttributes – указатель на структуру, определяющую возможность наследования хэндла на ресурс дочерними процессами
dwCreationDisposition – действие, которое следует выполнить если ресурс существует или не существует
dwFlagsAndAttributes – атрибуты и флаги файла
hTemplateFile –должен быть NULL
Функция ReadFile читает данные из файла, начиная с позиции, на которой находится указатель на файл. Может быть использована как для синхронного, так и для асинхронного чтения. В данной программе используется второй вариант.
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
hFile – хэндл файла, из которого производится чтение
lpBuffer – указатель на буфер, в который будет производиться чтение.
nNumberOfBytesRead – количество байт для чтения из файла
lpNumberOfBytesread – указатель на переменную, куда будет записано количество прочитанных байт
lpOverlapped – указатель на структуру, используемую при асинхронном вводе/выводе.
Функция WriteFile записывает данные в файл, начиная с позиции, на которой находится указатель на файл. Может быть использована как для синхронной, так и для асинхронной записи. Как и в случае с ReadFile, WriteFile используется для асинхронной записи.
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
hFile – хэндл файла, в который будет производиться запись
lpBuffer – указатель на буфер, содержащий данные для записи
nNumberOfBytesRead – количество байт для записи в файл
lpNumberOfBytesread – указатель на переменную, куда будет записано количество записанных байт
lpOverlapped – указатель на структуру, используемую при асинхронном вводе/выводе.
Функция CloseHandle закрывает открытый хэндл объекта.
BOOL CloseHandle(
HANDLE hObject
);
hObject – закрываемый хэндл.
Функция GetCommState получает информацию о настройках выбранного коммуникационного устройства.
BOOL GetCommState(
HANDLE hFile,
LPDCB lpDCB
);
hFile – хэндл устройства
lpDCB – указатель на DCB-структуру, куда будет записана полученная информация.
Функция SetCommState настраивает выбранное коммуникационное устройство в соответствии с DCB-структурой.
BOOL SetCommState(
HANDLE hFile,
LPDCB lpDCB
);
hFile – хэндл устройства
lpDCB – указатель на DCB-структуру для получения настроек.
DCB-структура определяет настройки последовательного коммуникационного устройства. Здесь приведены лишь поля структуры, использованные в проекте.
typedef struct _DCB {
DWORD BaudRate;
BYTE ByteSize; BYTE Parity; BYTE StopBits;
};
BaudRate – скорость, на которой работает коммуникационное устроство, в бодах.
ByteSize – количество битов в принятых и переданных байтах.
Parity – настройка четности. Может быть одним из заранее предустановленных значений.
StopBits – количество используемых стоповых битов.
Общая схема работы с COM-портом такова:
- Порт открывается для чтения и записи при помощи функций ReadFile и WriteFile.
- Настройки COM-порта сохраняются в DCB-структуре при помощи функции GetCommState.
- В настройки вносятся необходимые изменения, после чего при помощи функции SetCommState структура используется для перенастройки COM-порта.
- При помощи функций WriteFile и ReadFile осуществляется обмен данными между ПК и МК.
- Хэндл COM-порта закрывается при помощи функции CloseHandle.
