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

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

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

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

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

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” / Кафедра ЕОМ Звіт до лабораторної роботи №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:11-

Коментарі

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

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

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

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

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

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

Admin

26.02.2023 12:38

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