Відтворення передані посимвольних даних через USB порт
у графічному вигляді .
МЕТА РОБОТИ: ознайомитися з процесом формування та передачі постмвольних даних у графічному представленні в схемі кодування NRZI через послідовний USB інтерфейс.
Для передачі сигналів шина USB використовує чотирипровідною інтерфейс. Одна пара провідників ("+5В" і "загальний") призначена для живлення периферійних пристроїв з навантаженням до 500 мА. Дані передаються по іншій парі ("D+" "D-"). Для передачі даних використовується диференціальна напруга до 3 В (з метою зниження впливу шуму) і схема кодування NRZI (що позбавляє від необхідності виділяти додаткову пару провідників під тактовий сигнал).
На рис 63 “а” і “б” наведено графіки передачі посимвольних даних прізвища студента в системі кодування NRZI.
Рис 63.а. Посимвольна передача даних
Рис 63.б. Посимвольна передача даних
ПИТАННЯ ДЛЯ САМОПЕРЕВІРКИ
1. Привести схеми передачі даних через USB .
2. Привести призначення контактів роз’ємів USB.
3. Привести формат даних USB.
4. Привести основні етапи відлагодження програми
5. Пояснити роботу написаної програми.
6. Пояснити роботу USB .
ЗМІСТ ЗВІТУ
7. Мета роботи;
8. Короткі теоретичні відомості;
9. Хід роботи;
10. Висновки;
11. Текст програми (у додатку);
12. Демонстрація програми на комп’ютері.
ПРИКЛАД ВИКОНАННЯ ОСНОВНИХ ЕТАПІВ РОБІТ
Тут подана інформація, яка допомагає створити проект програми в середовищі Visual C++ 6.0.
Для того щоб створити новий проект необхідно запустити на виконання програму MS Visual C++ 6.0 (Рис.64).
Рисунок 64. Середовище програмування MS Visual C++ 6.0.
Далі в меню середовища MS Visual C++ 6.0 вибрати “File” –> “New” (Рис.65).
Необхідно обов’язково позначити тип нового проекту (MFC AppWizard (exe)), вказати його назву і натиснути “OK”.
Рисунок 65. Вікно створення нового MFC проекту.
Далі треба вибрати вигляд головного вікна нового MFC проекту (Рис.66) і натиснути “OK”.
Рисунок 66. Вікно вибору вигляду головного вікна нового MFC проекту.
На наступному вікні треба зняти всі прапорці і ввести заголовок вікна діалогу (Рис.67).
Рисунок 67. Вікно вигляду елементів діалогу.
Далі треба натиснути “Next” (Рис.68)
Рисунок 68. Вікно вибору властивостей проекту.
Далі треба натиснути “Finish” (Рис.69)
Рисунок 69. Вікно вибору властивостей проекту.
Далі прочитати сумарну інформацію про новий MFC проект (Рис.70) і, якщо немає помилок, натиснути “OK”. В іншому випадку натиснути “Cancel” і відмінити створення нового проекту.
Рисунок 70. Вікно сумарної інформації про новий MFC проект.
Для того щоб відкрити існуючий проект необхідно вибрати “Ореn Workspace…” або “Recent Workspaces” з “File” меню.
Новий MFC проект (Рис.71) містить класи, ресурси і файли програми (CTestApp) та вікна діалогу (CTestDlg).
Рисунок 71. Вікно середовища MS Visual C++ 6.0 з новим проектом.
Клас C Laba 2App містить функцію InitInstance(), з якої починається виконання програми і створення об’єкту програми theApp (Рис.72). В функції InitInstance() створюється об’єкт діалогу, до нього приєднується вікно діалогу і діалог відображається на екрані. Крім того є обробники натискання клавіш “OK” і “Cancel”. Там можна додати свій зміст.
Рисунок 72. Клас CLaba2 App.
Клас CLaba2Dlg містить функції OnInitDialog() та OnPaint() (Рис.73). В функції OnInitDialog() налаштовується зовнішній вигляд вікна діалогу, а функція OnPaint() здійснює вивід вікна діалогу на екран.
Рисунок 73. Клас CLaba2 Dlg.
Для додавання функціональності до діалогу спочатку треба нарисувати додаткові елементи керування в редакторі діалогів (Рис.74).
Рисунок 74. Редактор діалогу.
Для цього на панелі елементів керування вибирається один елемент. На вікні діалогу мишею натягується прямокутник. Після відпускання кнопки миші, на вікні діалогу з’являється зображення елемента керування. Для даної лабораторної роботи необхідно на вікні діалогу встановити об’єкти типу Edit (поле редагування) та Button (кнопка) (Рис.75).
Рисунок 75. Розміщення елементів керування.
Для зв’язування елемента керування з об’єктом елемента керування треба викликати для нього “майстер” класів (Рис.76). На першій закладці знаходяться елементи карти повідомлень. (Рис.77).
Рис 76. Виклик майстра класів через контекстне меню діалогу
Рисунок 77. Вікно “майстра” класів, закладка “Карта повідомлень”.
На другій закладці знаходяться змінні класу діалогу (Рис.78).
![]() |
Рисунок 78. Вікно “майстра” класів, закладка “Змінні класу”.
Для додавання нової змінної треба натиснути “Add Variable…”.З’явиться вікно створення нової змінної класу (Рис.79). В ньому обов’язково треба вказати назву змінної, яка починається на m_, категорію (по значенню або об’єктна) та тип змінної.
Рисунок 79. Вікно створення нової змінної класу.
Після створення нової змінної вона з’являється на закладці “Змінні класу” “майстра” класів (Рис.80). Після натиснення “OK” можна побачити, що нова змінна з’явилась в середовищі у вікні перегляду класів і в тексті програми (Рис.81).
Рисунок 80. Вікно “майстра” класів після створення змінної.
Рисунок 81. Вікно середовища з новою змінною.
У відповідь на дії користувача в віконній програмі виникають повідомлення . Для обробки повідомлень треба включити повідомлення в карту повідомлень і додати до класу спеціальну функцію – обробник повідомлення. Найбільш коректно ці дії виконує майстер повідомлень (Рис.82). Для додавання нового обробника повідомлень треба вибрати елемент керування, повідомлення якого будуть оброблятися, вибрати повідомлення, для якого потрібен обробник, і натиснути клавішу “Add Function…”.
Рисунок 82. Вікно “майстра” класів при створенні обробника повідомлення.
У вікні додавання нового обробника треба ввести назву функції-обробника (Рис.83), яка обов’язково повинна починатися з On, і натиснути “OK”.
Рисунок 83. Вікно додавання обробника повідомлення.
В нижній частині вікна “майстра” класів з’явиться нова функція – член класу і повідомлення, яке ця функція обробляє (Рис.84).
Рисунок 84. Вікно “майстра” класів після створення обробника повідомлення.
Після натиснення “OK” можна побачити, що нова функція з’явилась в середовищі у вікні перегляду класів і в тексті програми (Рис.85).
Рисунок 85. Вікно середовища з новим обробником повідомлення.
Якщо запустити програму на компіляцію і виконання, то вона створить вікно діалогу з елементами керування (Рис.86)
Рисунок 86. Вікно програми після виконання.
Елемент Edit можна використовувати для введення інформації на передавання. Для цього потрібно в обробнику повідомлення натиснення кнопки Button1 написати реалізацію програми передавання даних з рядка редагування Edit (використовуючи вже створену змінну m_Edit) на USB-порт .
У вікні діалогу потрібно змінити напис на кнопці Button1. Для цього у властивостях даного елементу керування змінюємо поле Caption з “Button1” на “Передача даних” (рис. 87 і рис. 88).
Рис 87. Контекстне меню елемента Button1
Рис 88. Закладка General властивостей елемента Button1
В результаті вікно діалогу має вигляд (рис. 89):
Рис 89. Вікно програми
До нашого проекту додамо ще одну кнопку “Прочитати з файлу” (рис. 90)
Рис 90. Вікно програми
Edit повинен бути багато стрічковий (Multiline) і підтримувати перехід на нову стрічку за допомогою “Want return” (рис. 91 і 92)
Рис 91. Вікно програми
Рис 92. Закладка Styles властивостей елемента Edit1
Далі, за допомогою “майстра” класів, створимо обробник натиснення клавіші “Прочитати з файлу” (Рис.93).
Рис 93. Вікно середовища з текстом програми
Після натиснення клавіші “Прочитати з файлу” на екрані з’являється діалог вибору файлів (Рис.94), який дозволяє здійснювати навігацію по файловій системі. Треба обов’язково вибрати файл і натиснути клавішу “Открить”. Після натиснення клавіші “Отмена” операція відкривання файлу не відбудеться.
Рис 94. Вікно діалогу вибору файлів
Після натиснення клавіші “Open” з’явиться зміст файлу (Рис.95).
Рис 95. Вікно програми після вибору файла
Тепер залишається тільки в обробнику повідомлення натиснення кнопки “Передача даних” (Button1) написати функцію, що буде здійснювати передачу інформації з елемента Edit на USB-порт.
Нижче наводиться приклад програми передачі даних на USB-порт.
Також приводяться графіки передачі по символьних даних прізвища студента в NRZI (рис. 96. Рис.97).
Приклад програми
// laba2Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "laba2.h"
#include "laba2Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLaba2Dlg dialog
CLaba2Dlg::CLaba2Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CLaba2Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CLaba2Dlg)
m_Edit = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CLaba2Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLaba2Dlg)
DDX_Text(pDX, IDC_EDIT1, m_Edit);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CLaba2Dlg, CDialog)
//{{AFX_MSG_MAP(CLaba2Dlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLaba2Dlg message handlers
BOOL CLaba2Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CLaba2Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CLaba2Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CLaba2Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
char My_Data[] =m_Edit.LoadString; // Дані для запису
DWORD dwBytesWritten;
f or (int i = 0; i < m_Edit.GetLength; i++) {
char *DscT="X:";
DscT[0]= char(65+i) ; // наступна буква диску
int DR_T = GetDriveType(DscT); // повертає тип диску
cout << DscT << DR_T; // 3 - жорсткий 5 - CD/DVD 2 – флеш-пам'ять
if (DR_T == 2) // якщо флеш-пам'ять, то
{
cout << " - FLASH ";
char *My_File="X:\MyFile.txt"; // шлях та назва файла, який потрібно створити
My_File[0]=DscT[0]; // замість X записуєм потрібну букву диску
HANDLE hFile;
//відкриваєм файл, якщо його немає, то створюємо
hFile=CreateFile(My_File, GENERIC_READ|GENERIC_WRITE , 0,NULL,
OPEN_ALWAYS,0,NULL);
ShowMessage(SysErrorMessage(GetLastError())); // результат виконання
// Записуєм дані з масиву My_Data
WriteFile(hFile, My_Data,sizeof(My_Data), &dwBytesWritten, NULL);
ShowMessage(SysErrorMessage(GetLastError())); // результат виконання
// "Закриваем файл" дескриптор.
CloseHandle(hFile);
ShowMessage(SysErrorMessage(GetLastError())); // результат выполнение
}
cout << "\n" ;
}
getc(stdin);
return 0;
}
void CLaba2Dlg::OnButton2()
{
// TODO: Add your control notification handler code here
CFile file1;
CFileDialog fileDlg(true);
int nResponse = fileDlg.DoModal();
if (nResponse == IDOK)
{
file1.Open(fileDlg.GetPathName(), CFile::modeRead);
char*str = new char [file1.GetLength()-4];
file1.Read(str,file1.GetLength());
SetDlgItemText(IDC_EDIT1,str);
}
}
Навчальне видання
Периферійні пристрої
Методичні вказівки до комплексу лабораторних робіт для студентів базового напряму 6.050102 - “Комп’ютерна інженерія”
Укладачі Парамуд Я.С., к. т. н, доцент
Миц А.М., асистент.
Редактор
Комп’ютерне верстання
Здано у видавництво . Підписано до друку
Формат 70х100/16. Папір офсетний. Друк на різографі
Умовн. друк. арк. Обл..-вид. арк..
Тираж прим. Зам..
Видавництво Національного університету “Львівська політехніка”
Реєстраційне свідоцтво ДК №751 від 27.12.2001 р.
Поліграфічний центр Видавництва
Національного університету “Львівська політехніка”
Вул.. Ф. Колесси, 2. Львів, 79000