DevioLab CRYPTO TRADING AUTOMATION
LIVE
AUTOMATED CRYPTO TRADING • BINANCE
Автоматизуйте свій криптопортфель
Торгові боти DevioLab аналізують крипторинок, автоматично відкривають і закривають позиції та керують вашим портфелем на Binance 24/7.
CRYPTO 80 Bots
BINANCE Spot Trading
TRADING 24 / 7
Спробувати DevioLab
deviolab.com

Передача даних через COM-порт

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2013
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Периферійні пристрої

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” / Кафедра ЕОМ Звіт до лабораторної роботи №1-4 з дисципліни " Периферійні Пристрої " На тему «Передача даних через COM-порт» Мета роботи: ознайомитися з процесом передачі даних через послідовний інтерфейс RS-232C (COM-порт). Теоретичні відомості Асинхронний послідовний інтерфейс – це основний тип інтерфейсу, за допомогою якого здійснюється передача даних між комп’ютерами. Термін асинхроний означає, що при передачі даних не використовуються ніякі синхронізуючі сигнали, і окремі символи можуть передаватись з випадковими інтервалами, як, наприклад при вводі даних з клавіатури. Кожному символу, який передається через послідовне з’єднання, мусить передувати стандартний стартовий сигнал, а завершувати його передачу – стоповий сигнал. Стартовий сигнал – це нулевий біт, його ще називають стартовим бітом. Його призначення – повідомити пристою, який приймає дані про те, що наступні вісім бітів представляють собою байт даних. Після символа передаються один чи два стопових біта, які дають сигнал про закінчення передачі символа. В пристрої який приймає дані, символи розпізнаються по появі стартових і стопових сигналів, а не по моменту їх передачі. Асинхроний інтерфейс орієнтований на передачу символів (байтів), а при передачі використовується приблизно 20% інформації тільки для ідентифікації кожного символа. Термін послідовний означає, що передача даних виконується по одиночному провіднику, а біти передаються послідовно один за другим. Такий тип зв’язку характерний для телефонної мережі, в якій кожний напрямок обслуговує один провідник. Багато компаній випускають доповняльні послідовні порти для комп’ютерів, звичайно ті порти встановлюються на багатофункціональних платах чи на платі з паралельним портом. На рисунку 1, показано стандартний 9-контактний роз’єм послідовного порта: / Рис.1 Роз’єм послідовного порту До послідовного порта можна підключити самі різноманітні пристрої: модеми, плотери, принтери, інші комп’ютери, пристрої зчитування штрих-кодів, схему керування пристроями чи макетну плату. В основному у всіх пристроях, для яких потрібен двонапрямлений зв’язок з комп’ютером, використовується порт, який став стандартом – RS-232C (Reference Standard number 232 version C – стандарт обміну номер 232 версії С), який позволяє передавати дані між несумісними пристроями. Рис. 3 Розташування контактів роз’ємів DB25P та DB9P Найменування Напрям Опис Контакт (25-контактний роз'єм DB25P ) Контакт (9-контактний роз'єм DB9P)  DCD IN Carrie Detect (Визначення несучої) 8 1  - RXD IN Receive Data (Дані, що приймаються) 3 2  - TXD OUT Transmit Data (Дані, що передаються) 2 3  DTR OUT Data Terminal Ready (Готовність терміналу) 20 4  GND - System Ground (Корпус системи) 7 5  DSR IN Data Set Ready (Готовність даних) 6 6  RTS OUT Request to Send (Запит на відправку) 4 7  CTS IN Clear to Send (Готовність прийому) 5 8  RI IN Ring Indicator (Індикатор) 22 9   Завдання на лабораторну роботу Написати програму, яка б організовувала передачу даних через СОМ-порт між двома комп’ютерами. Програма повинна складатися з двох частин: програми-передавача та програми-приймача, які розміщуються відповідно на комп’ютері, що передає дані та на комп’ютері, що їх приймає. Текст програми Передавач // SenderVoiparovskuiDlg.cpp : implementation file // #include "stdafx.h" #include "SenderVoiparovskui.h" #include "SenderVoiparovskuiDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif HANDLE PortName; char*rt; int i = 0; // CAboutDlg dialog used for App About class CAboutDlg : public CDialogEx { public: CAboutDlg(); // Dialog Data enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() CSenderVoiparovskuiDlg::CSenderVoiparovskuiDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CSenderVoiparovskuiDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_send = _T(""); m_byte = 0; m_b = _T(""); } void CSenderVoiparovskuiDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO1, m_port); DDX_Control(pDX, IDC_COMBO2, m_BaundRate); // DDX_Check(pDX, IDC_CHECK1, m_check); DDX_Control(pDX, IDC_CHECK1, m_ch); DDX_Text(pDX, IDC_EDIT1, m_send); DDX_Control(pDX, IDC_EDIT2, m_time); DDX_Text(pDX, IDC_EDIT3, m_byte); // DDX_Control(pDX, IDC_CHECK1, m_combo); DDX_Check(pDX, IDC_CHECK1, m_check); DDX_Control(pDX, IDC_CHECK1, m_ch); DDX_Text(pDX, IDC_EDIT3, m_b); // DDX_Control(pDX, IDC_EDIT3, m_set); } BEGIN_MESSAGE_MAP(CSenderVoiparovskuiDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_CHECK1, &CSenderVoiparovskuiDlg::OnBnClickedCheck1) ON_BN_DOUBLECLICKED(IDC_CHECK1, &CSenderVoiparovskuiDlg::OnDoubleclickedCheck1) ON_EN_CHANGE(IDC_EDIT1, &CSenderVoiparovskuiDlg::OnEnChangeEdit1) ON_EN_CHANGE(IDC_EDIT3, &CSenderVoiparovskuiDlg::OnChangeEdit3) END_MESSAGE_MAP() // CSenderVoiparovskuiDlg message handlers BOOL CSenderVoiparovskuiDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 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 } void CSenderVoiparovskuiDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 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 CSenderVoiparovskuiDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting CRect rect; GetClientRect(&rect); SendMessage(WM_ICONERASEBKGND, reinterpret_cast<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 { CDialogEx::OnPaint(); } } // The system calls this function to obtain the cursor to display while the user drags // the minimized window. HCURSOR CSenderVoiparovskuiDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CSenderVoiparovskuiDlg::OnBnClickedCheck1() { if(m_ch.GetCheck() == BST_CHECKED) { char chPortName [10]; char rate[10]; DCB dcb; m_port.GetWindowTextW((LPTSTR)chPortName,10); m_BaundRate.GetWindowTextW((LPTSTR)rate,10); int n = atoi(rate); PortName = CreateFile((LPCWSTR)chPortName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if(PortName == INVALID_HANDLE_VALUE ) MessageBox(_T("Error opening port"), _T("Error"),MB_OK); else { GetDlgItem(IDC_EDIT1)->EnableWindow(true); COMMTIMEOUTS CommTimeOuts; CommTimeOuts.ReadIntervalTimeout = MAXDWORD; CommTimeOuts.ReadTotalTimeoutMultiplier = 0; CommTimeOuts.ReadTotalTimeoutConstant = 0; CommTimeOuts.WriteTotalTimeoutMultiplier = 0; CommTimeOuts.WriteTotalTimeoutConstant = 1000; SetCommTimeouts(PortName, &CommTimeOuts); GetCommState(PortName, &dcb); dcb.BaudRate =n; // current baud rate dcb.fBinary = TRUE; // binary mode, no EOF check dcb.fParity = TRUE; // enable parity checking dcb.ByteSize = 8; // number of bits/byte, 4-8 dcb.Parity = NOPARITY; // 0-4=no,odd,even,mark,space dcb.StopBits = ONESTOPBIT; m_port.EnableWindow(false); m_BaundRate.EnableWindow(false); } } else { CloseHandle(PortName); PortName = 0; m_port.EnableWindow(true); m_BaundRate.EnableWindow(true); } } void CSenderVoiparovskuiDlg::OnDoubleclickedCheck1() { } void CSenderVoiparovskuiDlg::OnEnChangeEdit1() { UpdateData(TRUE); CString c; int length = m_send.GetLength(); DWORD Bytes = 0; SYSTEMTIME tim; GetLocalTime(&tim); USES_CONVERSION; if(length == 0) MessageBox(_T("Empty Data ")); else { LPTSTR pszText = m_send.GetBuffer(); rt = T2A(pszText); char t = m_send.GetAt(m_send.GetLength()-1); WriteFile(PortName, &t, 1, &Bytes, NULL); c.Format(_T("%.2d:%.2d:%.2d:%.3d"),tim.wHour,tim.wMinute,tim.wSecond,tim.wMilliseconds); m_time.SetWindowTextW(c); } } void CSenderVoiparovskuiDlg::OnChangeEdit3() { UpdateData(true); Invalidate(); UpdateWindow(); USES_CONVERSION; CDC *pDC = GetWindowDC(); pDC->SaveDC(); POINT p1,p2,p3; p1.x=10; p1.y=190; CPen penGreen; penGreen.CreatePen(PS_SOLID,1,RGB(255,0,0)); pDC->SelectObject(&penGreen); LPTSTR pszText = m_send.GetBuffer(); char *rt = T2A(pszText); CString m = m_b.GetBuffer(); m.Format(_T("%d"), m_byte); if(m_byte > (m_send.GetLength()-1) && i != 0) MessageBox(_T("Invaild byte number")); else { i++; rt[0]=rt[m_byte]; CPen penBlack; penBlack.CreatePen(PS_SOLID,1,RGB(255,0,0)); pDC->SelectObject(&penBlack); p1.x=10; p1.y=190; pDC->MoveTo(p1); pDC->LineTo(p1.x+=40,p1.y); pDC->LineTo(p1.x,p1.y+=100); pDC->LineTo(p1.x+=40,p1.y); CRect rcText3( 40, 300, 100,340 ); pDC->DrawText(_T("start"),&rcText3,DT_CENTER); bool parity=!(rt[0]%2); p2.x=20; p2.y=130; p3.x=120; p3.y=170; for(int i=0; i<8;i++) { CPen penBlack; penBlack.CreatePen(PS_SOLID,1,RGB(0,0,0)); pDC->SelectObject(&penBlack); if(rt[0]&0x80)//high signal { p1.y=190; pDC->LineTo(p1); p1.x+=40; pDC->LineTo(p1); CRect rcText1( p2.x+=40, 300, p2.y+=40,340 ); pDC->DrawText(_T("1"),&rcText1,DT_CENTER); } else //low signal { p1.y=290; pDC->LineTo(p1); p1.x+=40; pDC->LineTo(p1); CRect rcText2( p2.x+=40, 300, p2.y+=40,340 ); pDC->DrawText(_T("0"),&rcText2,DT_CENTER); } rt[0]<<=1; } pDC->SelectObject(&penGreen); if(parity) { p1.y=190; pDC->LineTo(p1); p1.x+=40; pDC->LineTo(p1); CRect rcText1( p2.x+=40, 300, p2.y+=40,340 ); pDC->DrawText(_T("par"),&rcText1,DT_CENTER); } else { p1.y=290; pDC->LineTo(p1); p1.x+=40; pDC->LineTo(p1); CRect rcText1( p2.x+=40, 300, p2.y+=40,340 ); pDC->DrawText(_T("par"),&rcText1,DT_CENTER); } p1.y=190; pDC->LineTo(p1); p1.x+=40; pDC->LineTo(p1); CRect rcText1( p2.x+=40, 300, p2.y+=80,340 ); pDC->DrawText(_T("Stop"),&rcText1,DT_CENTER); p1.x+=40; pDC->LineTo(p1); } } Приймач // ReciverVoiparovskuiDlg.cpp : implementation file // #include "stdafx.h" #include "ReciverVoiparovskui.h" #include "ReciverVoiparovskuiDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif HANDLE PortName; static int TIME = 1000; int i = 0; // CAboutDlg dialog used for App About class CAboutDlg : public CDialogEx { public: CAboutDlg(); // Dialog Data enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CReciverVoiparovskuiDlg dialog CReciverVoiparovskuiDlg::CReciverVoiparovskuiDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CReciverVoiparovskuiDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_b = _T(""); m_rec = _T(""); m_byte = 0; } void CReciverVoiparovskuiDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO1, m_port); DDX_Control(pDX, IDC_COMBO2, m_BaundRate); DDX_Control(pDX, IDC_CHECK1, m_ch); DDX_Control(pDX, IDC_EDIT1, m_recive); DDX_Control(pDX, IDC_EDIT2, m_time); DDX_Text(pDX, IDC_EDIT3, m_b); DDX_Text(pDX, IDC_EDIT1, m_rec); DDX_Text(pDX, IDC_EDIT3, m_byte); } BEGIN_MESSAGE_MAP(CReciverVoiparovskuiDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_CHECK1, &CReciverVoiparovskuiDlg::OnBnClickedCheck1) ON_WM_TIMER() ON_EN_CHANGE(IDC_EDIT3, &CReciverVoiparovskuiDlg::OnChangeEdit3) END_MESSAGE_MAP() // CReciverVoiparovskuiDlg message handlers BOOL CReciverVoiparovskuiDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 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 } void CReciverVoiparovskuiDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 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 CReciverVoiparovskuiDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast<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 { CDialogEx::OnPaint(); } } // The system calls this function to obtain the cursor to display while the user drags // the minimized window. HCURSOR CReciverVoiparovskuiDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CReciverVoiparovskuiDlg::OnBnClickedCheck1() { if(m_ch.GetCheck() == BST_CHECKED) { char chPortName [10]; char rate[10]; DCB dcb; SetTimer(1,1,NULL); m_port.GetWindowTextW((LPTSTR)chPortName,10); m_BaundRate.GetWindowTextW((LPTSTR)rate,10); int n = atoi(rate); PortName = CreateFile((LPCWSTR)chPortName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if(PortName == INVALID_HANDLE_VALUE ) MessageBox(_T("Error opening port"), _T("Error"),MB_OK); else { // GetDlgItem(IDC_EDIT1)->EnableWindow(true); COMMTIMEOUTS CommTimeOuts; CommTimeOuts.ReadIntervalTimeout = MAXDWORD; CommTimeOuts.ReadTotalTimeoutMultiplier = 0; CommTimeOuts.ReadTotalTimeoutConstant = 0; CommTimeOuts.WriteTotalTimeoutMultiplier = 0; CommTimeOuts.WriteTotalTimeoutConstant = 1000; SetCommTimeouts(PortName, &CommTimeOuts); GetCommState(PortName, &dcb); dcb.BaudRate =n; // current baud rate dcb.fBinary = TRUE; // binary mode, no EOF check dcb.fParity = TRUE; // enable parity checking dcb.ByteSize = 8; // number of bits/byte, 4-8 dcb.Parity = NOPARITY; // 0-4=no,odd,even,mark,space dcb.StopBits = ONESTOPBIT; m_port.EnableWindow(false); m_BaundRate.EnableWindow(false); } } else { CloseHandle(PortName); PortName = 0; m_port.EnableWindow(true); m_BaundRate.EnableWindow(true); } } void CReciverVoiparovskuiDlg::OnTimer(UINT_PTR nIDEvent) { char m_data[128] ; UpdateData(TRUE); CString time; DWORD dwBytesRead = 0; SYSTEMTIME tim; GetLocalTime(&tim); ReadFile(PortName, m_data, sizeof(m_data), &dwBytesRead, NULL); time.Format(_T("%.2d:%.2d:%.2d:%.3d"),tim.wHour,tim.wMinute,tim.wSecond,tim.wMilliseconds); m_data[dwBytesRead]=0; CString tmp(m_data); if(dwBytesRead!=0) { m_time.SetWindowTextW(time); m_recive.ReplaceSel(tmp); } else CDialogEx::OnTimer(nIDEvent); } void CReciverVoiparovskuiDlg::OnChangeEdit3() { UpdateData(true); Invalidate(); UpdateWindow(); USES_CONVERSION; CDC *pDC = GetWindowDC(); pDC->SaveDC(); POINT p1,p2,p3; p1.x=10; p1.y=190; CPen penGreen; penGreen.CreatePen(PS_SOLID,1,RGB(255,0,0)); pDC->SelectObject(&penGreen); LPTSTR pszText = m_rec.GetBuffer(); char *rt = T2A(pszText); CString m = m_b.GetBuffer(); m.Format(_T("%d"), m_byte); if(m_byte > (m_rec.GetLength()-1) && i != 0) MessageBox(_T("Invaild byte number")); else { i++; rt[0]=rt[m_byte]; CPen penBlack; penBlack.CreatePen(PS_SOLID,1,RGB(255,0,0)); pDC->SelectObject(&penBlack); p1.x=10; p1.y=190; pDC->MoveTo(p1); pDC->LineTo(p1.x+=40,p1.y); pDC->LineTo(p1.x,p1.y+=100); pDC->LineTo(p1.x+=40,p1.y); CRect rcText3( 40, 300, 100,340 ); pDC->DrawText(_T("start"),&rcText3,DT_CENTER); bool parity=!(rt[0]%2); p2.x=20; p2.y=130; p3.x=120; p3.y=170; for(int i=0; i<8;i++) { CPen penBlack; penBlack.CreatePen(PS_SOLID,1,RGB(0,0,0)); pDC->SelectObject(&penBlack); if(rt[0]&0x80)//high signal { p1.y=190; pDC->LineTo(p1); p1.x+=40; pDC->LineTo(p1); CRect rcText1( p2.x+=40, 300, p2.y+=40,340 ); pDC->DrawText(_T("1"),&rcText1,DT_CENTER); } else //low signal { p1.y=290; pDC->LineTo(p1); p1.x+=40; pDC->LineTo(p1); CRect rcText2( p2.x+=40, 300, p2.y+=40,340 ); pDC->DrawText(_T("0"),&rcText2,DT_CENTER); } rt[0]<<=1; } pDC->SelectObject(&penGreen); if(parity) { p1.y=190; pDC->LineTo(p1); p1.x+=40; pDC->LineTo(p1); CRect rcText1( p2.x+=40, 300, p2.y+=40,340 ); pDC->DrawText(_T("par"),&rcText1,DT_CENTER); } else { p1.y=290; pDC->LineTo(p1); p1.x+=40; pDC->LineTo(p1); CRect rcText1( p2.x+=40, 300, p2.y+=40,340 ); pDC->DrawText(_T("par"),&rcText1,DT_CENTER); } p1.y=190; pDC->LineTo(p1); p1.x+=40; pDC->LineTo(p1); CRect rcText1( p2.x+=40, 300, p2.y+=80,340 ); pDC->DrawText(_T("Stop"),&rcText1,DT_CENTER); p1.x+=40; pDC->LineTo(p1); } } Результати виконання: / Рис.1 – передавач / Рис.2 – приймач Висновок: на даній лабораторній роботі я ознайомився з процесом передачі даних через послідовний інтерфейс RS-232C (COM-порт).
Антиботан аватар за замовчуванням

19.11.2013 20:37

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!