Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Лабораторна робота №3
з предмету “ Периферійні пристрої ”
Моделювання послідовного інтерфейсу RS-232C
Львів – 2005
Для засвоєння принципу роботи послідовного інтерфейсу RS-232C було запропоновано написати програмну емуляцію цього інтерфейсу. Програма має в графічному режимі відобразити процес передачі даних. Для написання програми було використано середовище розробки Microsoft Visual Studio 6.0 (C++).
Для того щоб забезпечити передавання даних необхідні наступні модулі:
Передавач даних (виділений в клас CTransmitter)
Приймач даних (Виділений в клас CReceiver)
Середовище передавання даних, або лінія зв’язку (CLine)
Генератор тактових імпульсів для передавача та приймача (CGenerator)
Алгоритм передачі даних буде повністю описаний в третій лабораторній роботі.
Розглянемо, що являє собою клас CLine – лінія передачі даних (всі інші класи були розглянуті в попередніх лабораторних роботах).
class CLine
{
public:
CLine();
virtual ~CLine();
void Write(int s) {signal=s;}
int Read() const {return signal;}
private:
int signal;
};
Змінна signal – поточне значення сигналу в лінії. Метод Write використовується для запису, Read – для читання.
void CJCOMbetaDlg::OnbExec()
{
UpdateData(TRUE);
int Delay=atoi(m_valDelay);
int TxFreq=100;
int RxFreq=100+m_Slider.GetPos();//[+/-]10%
int ArrSize=((TxFreq>RxFreq)?TxFreq:RxFreq)*8*12+2*Delay;
//=========DRAWING
CUIntArray TxCLK; TxCLK.SetSize(ArrSize,1);
CUIntArray RxCLK; RxCLK.SetSize(ArrSize,1);
CUIntArray LineData; LineData.SetSize(ArrSize,1);
CUIntArray Received; Received.SetSize(ArrSize,1);
//====END==DRAWING
CString Data=(m_SendData);
Data="10"+Data+"11";
CLine *TheLine= new CLine;
CTransmitter *Transmitter=new CTransmitter(TxFreq,Data,TheLine,Delay);
CReceiver *Receiver=new CReceiver(RxFreq,TheLine,Delay);
int i=0;
for (int j=0;j<ArrSize;j++)
{
Transmitter->Proceed();
Receiver->Proceed();
//FOR DRAWING:
TxCLK[i]=(Transmitter->GetCLK());
LineData[i]=(TheLine->Read());
RxCLK[i]=(Receiver->GetCLK());
Received[i++]=(Receiver->DEBUG_GET());
}
//------------------------------
DrawVertex(&TxCLK);
CClientDC dc(this);
TextOut(dc,0,0,"TxCLK",5);
TextOut(dc,0,30,"Tx(Line)",8);
TextOut(dc,0,60,"RxCLK",5);
TextOut(dc,0,90,"Rx",2);
Draw(30,&TxCLK,TxFreq*12*8,0x0000FF);
Draw(60,&LineData,TxFreq*12*8,0x0000FF);
Draw(90,&RxCLK,RxFreq*12*8,0xFF0000);
Draw(120,&Received,RxFreq*12*8,0xFF0000);
TxCLK.RemoveAll();
RxCLK.RemoveAll();
LineData.RemoveAll();
Received.RemoveAll();
delete(TheLine);delete(Receiver);delete(Transmitter);
m_bExec.EnableWindow(FALSE);
m_bExec.SetWindowText("Sent :))))))))");
UpdateData(FALSE);
}
Висновок: у ході виконання лабораторної роботи ми створили програму, яка графічно відображає процес передачі даних згідно інтерфейсу RS-232C.