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