Дослідження режимів функціонування інтерфейсу RS-232C

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

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

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

Рік:
2012
Тип роботи:
Лабораторна робота
Предмет:
Периферійні пристрої

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

Міністерство освіти і науки України Національний університет “Львівська політехніка” / Кафедра ЕОМ Звіт до лабораторних робіт № 1 – 4 з дисципліни: «Периферійні пристрої» на тему: «Дослідження режимів функціонування інтерфейсу RS-232C» Ознайомитися з процесом передачі даних через послідовний асинхронний інтерфейс RS-232C (COM-порт). КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ Асинхронний послідовний інтерфейс – це основний тип інтерфейсу, за допомогою якого здійснюється передача даних між комп’ютерами. Термін асинхроний означає, що при передачі даних не використовуються ніякі синхронізуючі сигнали, і окремі символи можуть передаватись з випадковими інтервалами, як, наприклад при вводі даних з клавіатури. Кожному символу, який передається через послідовне з’єднання, мусить передувати стандартний стартовий сигнал, а завершувати його передачу – стоповий сигнал. Стартовий сигнал – це нулевий біт, його ще називають стартовим бітом. Його призначення – повідомити пристою, який приймає дані про те, що наступні вісім бітів представляють собою байт даних. Після символа передаються один чи два стопових біта, які дають сигнал про закінчення передачі символа. В пристрої який приймає дані, символи розпізнаються по появі стартових і стопових сигналів, а не по моменту їх передачі. Асинхроний інтерфейс орієнтований на передачу символів (байтів), а при передачі використовується приблизно 20% інформації тільки для ідентифікації кожного символа. Термін послідовний означає, що передача даних виконується по одиночному провіднику, а біти передаються послідовно один за другим. Такий тип зв’язку характерний для телефонної мережі, в якій кожний напрямок обслуговує один провідник. Багато компаній випускають доповняльні послідовні порти для комп’ютерів, звичайно ті порти встановлюються на багатофункціональних платах чи на платі з паралельним портом. На рисунку 1, показано стандартний 9-контактний роз’єм послідовного порта: / Рис.1 Роз’єм послідовного порту До послідовного порта можна підключити самі різноманітні пристрої: модеми, плотери, принтери, інші комп’ютери, пристрої зчитування штрих-кодів, схему керування пристроями чи макетну плату. В основному у всіх пристроях, для яких потрібен двонапрямлений зв’язок з комп’ютером, використовується порт, який став стандартом – RS-232C (Reference Standard number 232 version C – стандарт обміну номер 232 версії С), який позволяє передавати дані між несумісними пристроями. Інтерфейс RS - 232С широко використовують у персональних комп'ютерах для обміну інформацією з периферійними пристроями у послідовному дуплексному режимі обміну. Спрощений варіант інтерфейсу стик С2 є аналогом інтерфейсу RS - 232С для колишніх країн економічної співдружності. Швидкість передавання даних в асинхронному режимі може становити біт/с: 50, 75, 100, 150, 300, 600, 1200, 2400, 4800, 9600, 19200. Інтерфейс RS-232C розроблено в 1969 році рядом корпорацій США для забезпечення з’єднання комп’ютерів та різноманітних периферійних пристроїв. Стандарт RS-232 в загальному випадку описує 4 інтерфейсні функції: 1. Визначення керувальних сигналів, що передаються через інтерфейс. 2. Визначення формату даних користувача, що передаються через інтерфейс. 3. Передачу тактових сигналів для синхронізації потоку даних. 4. Формування електричних характеристик інтерфейсу. Інтерфейс RS-232 є послідовним асинхронним інтерфейсом, в якому перед бітами даних передається спеціальний стартовий біт, після бітів даних йде біт паритета та 1 чи 2 стопових біти. Така сукупність бітів носить назву старт-стопного символу. Кожний старт-стопний символ, як правило, у якості бітів даних містить один інформаційний символ, наприклад, символ стандартного коду для обміну інформацією, що задається таблицею ASCII. Символи ASCII відображаються семибітовими кодовими словами. Так, наприклад, латинська буква А має код 1000001. Її передача рівнями ТТЛ зображена на рис. 2. Початок асинхронного символу завжди відмічається низьким рівнем стартового рівня (“0”). Після нього йдуть 7 біт даних, потім біт паритету, та 2 стопових біти. Біт паритету встановлюється в “1”, або “0”, наприклад, непарний паритет характеризується тим, що загальна кількість одиниць в групі з семи біт (сім даних + один біт паритету) повинно бути непарним числом. Стопові біти передаються високим рівнем (“1”). / Рис.2 Схема передачі даних через RS-232C. Комп'ютер має 25-контактний (DB25P) або 9-контактний (DB9P) роз'єми для підключення RS-232C. Розташування контактів роз’ємів зображене на рисунку 3. Призначення контактів роз'ємів приведене в таблиці 1. / / Рис. 3 Розташування контактів роз’ємів DB25P та DB9P Таблиця 1. Призначення контактів роз’ємів 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   Найчастіше використовуються трьох- або чотирьохпровідний зв'язок (для двонаправленої передачі). Схема з'єднання для чотирьохпровідної лінії зв'язку показана на рисунку 4. / Рис.4 Схема 4-провідної лінії зв'язку для RS-232C Для двопровідної лінії зв'язку у випадку передачі з комп'ютера на зовнішній пристрій використовуються сигнали SG і TхD. Всі 10 сигналів інтерфейсу задіюються лише при з'єднанні комп'ютера з модемом. Формат даних, що передаються, показаний на рисунку 5. Власне дані (5, 6, 7 або 8 біти) супроводжуются стартовим бітом, бітом парності і одним або двома стоповими бітами. Отримавши стартовий біт, приймач вибирає з лінії біти даних через визначені інтервали часу. Дуже важливо, щоб тактові частоти приймача і передавача були однаковими, допустима розбіжність - не більше 10 % / Рис. 5 Формат даних RS-232C Всі сигнали RS-232C передаються спеціально вибраними рівнями, що забезпечують високу завадостійкість зв'язку (рис.6). Відзначимо, що дані передаються в інверсному коді (логічній одиниці відповідає низький рівень, логічному нулю - високий рівень). / Рис. 6 Рівні сигналів RS-232C на передавальному і приймаючому кінцях лінії зв'язку. Обмін по RS-232C здійснюється за допомогою звернень по спеціально виділених для цього портах COM1 (адреси 3F8h...3FFh, переривання IRQ4), COM2 (адреси 2F8h...2FFh, переривання IRQ3), COM3 (адреси 3F8h...3EFh, переривання IRQ10), COM4 (адреси 2E8h...2EFh, переривання IRQ11). Формати звернень по цих адресах можна знайти в численних описах мікросхем контроллерів послідовного обміну UART (Universal Asynchronous Receiver/Transmitter), наприклад, i8250, КР580ВВ51. ХІД РОБОТИ Для створення програми передавача даних через послідовний асинхронний інтерфейс RS-232C (COM-порт) використовуємо стандартний елемент управління для Windows Forms, який має назву – Serial Port. Встановлюю необхідні елементи, для конфігурування COM-порта перед відкриттям, на форму. Поля призначені для: Назва порта Швидкість обміну Біт контролю Стопові біти Кнопки призначені для: Відкриття порта Закриття порта Надсилання повідомлення Також використовуємо таймер. Принцип роботи COM-порта Дані передаються пакетами по одному байту(8 біт). На початку передається стартовий біт протилежної полярності стану незанятої лінії, після чого передається безпосередньо кадр корисної інформації, від 5 до 8 біт. Побачивши стартовий біт, приймач очікує інтервал Т1, і зчитує перший біт, потім через інтервал Т2 зчитує решту інформаційних бітів. Останній біт – стоповий біт(стан незайнятої лінії), повідомляючи про те, що передача завершена. Можливо 1, 1.5, 2 стопових біта. В кінці байта, перед стоповим бітом, може передаватися біт парності для контролю якості передачі. Він дозволяє виявити помилку в непарну кількість бітів(використовується, так як найбільш можлива помилка в 1 біт). ГРАФІКИ «В» = DO 92 «О» = DO 9E «Л» = DO 9B «И» = DO 98 «Х» = DO A5 «Б» = DO 91 Старший байт кожної букви – DO, тому скріншот цього байту буде наведений лише один раз. Одна буква пересилається двома словами. / Рис. 1 – графік байта D0, який використовується у кожній великій літері кирилиці / Рис. 2 – графік байта 92 (DO 92 = «В») / Рис. 3 – графік байта 9E (DO 9E = «O») / Рис. 4 – графік байта 9B (DO 9B = «Л») / Рис. 5 – графік байта 98 (DO 98 = «И») / Рис. 6 – графік байта A5 (DO A5 = «X») / Рис. 7 – графік байта 91 (DO 91 = «Б») СКРІНШОТИ ПРОГРАМ // Рис. 1 – форма передавача та приймача / Рис. 2 – результат виконання програми ВИСНОВКИ В даній лабораторній роботі я дослідив принцип роботи COM-порта, а також принцип пересилки повідомлень. ДОДАТОК 1 ТЕКСТ ПРОГРАМИ ПЕРЕДАВАЧА private: System::Void bOpen_Click(System::Object^ sender, System::EventArgs^ e) { if(serialPort1->IsOpen != true){ if(cPortName->Text == "" || cBaudRate->Text == "" || cStopBit->Text == ""|| cBitOfParity->Text == ""){ MessageBox::Show( "Деякі параметри порта не були встановлені","Error", MessageBoxButtons::OK,MessageBoxIcon::Error ); } else{ bool fl = ConfigPort(cPortName->Text,cBaudRate->Text); serialPort1->WriteTimeout = 500; untitled1(cBaudRate->SelectedIndex,cBitOfParity->SelectedIndex,cStopBit->SelectedIndex); serialPort1->Open(); pStatus->BackColor = Color::Green; if(serialPort1->IsOpen != true){ MessageBox::Show( "Невдалось відкрити "+serialPort1->PortName+ ".\nПопробуйте використати інший порт","Error", MessageBoxButtons::OK,MessageBoxIcon::Error ); pStatus->BackColor = Color::Red; } } } else{ MessageBox::Show( "Перед відкриттям нового СОМ порта слід закрити поппередній " +serialPort1->PortName,"WARNING", MessageBoxButtons::OK,MessageBoxIcon::Warning ); } } /*==============FUNCTIONS===================*/ bool ConfigPort(String^ portName, String^ portRate){ //serialPort1->PortName = "COM"+portName; serialPort1->PortName = portName; __int32 i = System::Int32::Parse(portRate); serialPort1->BaudRate = i; serialPort1->DataBits = 8; serialPort1->Handshake = System::IO::Ports::Handshake::XOnXOff; //None RequestToSend RequestToSendXOnXOff XOnXOff //Вибір стопових бітів if(cStopBit->SelectedIndex == 0){ serialPort1->StopBits = System::IO::Ports::StopBits::One; }else if (cStopBit->SelectedIndex == 1){ serialPort1->StopBits = System::IO::Ports::StopBits::OnePointFive; }else{ serialPort1->StopBits = System::IO::Ports::StopBits::Two; } //Вибір паритету if(cBitOfParity->SelectedIndex == 0){ serialPort1->Parity = System::IO::Ports::Parity::Even; } else if(cBitOfParity->SelectedIndex == 1){ serialPort1->Parity = System::IO::Ports::Parity::Mark; } else if(cBitOfParity->SelectedIndex == 2){ serialPort1->Parity = System::IO::Ports::Parity::None; } else if(cBitOfParity->SelectedIndex == 3){ serialPort1->Parity = System::IO::Ports::Parity::Odd; } else{ serialPort1->Parity = System::IO::Ports::Parity::Space; } return true; } private: System::Void bMsg_Click(System::Object^ sender, System::EventArgs^ e) { if(serialPort1->IsOpen == true){ String^ lol1=tMsg->Text; int SOTR=lol1->Length*2; array<Byte>^bytes = Encoding::UTF8->GetBytes (lol1); serialPort1->Write(bytes,0,SOTR); //serialPort1->WriteLine(tMsg->Text); } else{ MessageBox::Show( "Спочатку відкрийте порт","WARNING", MessageBoxButtons::OK,MessageBoxIcon::Warning ); } } private: System::Void bClose_Click(System::Object^ sender, System::EventArgs^ e) { untitled2(); serialPort1->Close(); if(serialPort1->IsOpen == true){ MessageBox::Show( "Помилка при закритті","ERROR", MessageBoxButtons::OK,MessageBoxIcon::Error ); } else{ pStatus->BackColor = Color::Red; } } private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { //ComboBox with portName's ;) array<String^>^ portNameZ = nullptr; portNameZ = serialPort1->GetPortNames(); cPortName->Items->AddRange(portNameZ); //ComboBox with baudRate's ;) array<String^>^ baudRateZ = { "300", "1200", "2400", "4800", "9600", "14400", "19200", "28800", "38400", "57600", "115200", "230400"}; cBaudRate->Items->AddRange(baudRateZ); pStatus->BackColor = Color::Red; //ComboBox with bitOfParity ;) array<String^>^ bitOfParityZ = { "Доповнення до парності", "Біт парності завжди 1", "Біт парності відсутній", "Доповнення до непарності", "Біт парності завжди 0"}; cBitOfParity->Items->AddRange(bitOfParityZ); //ComboBox with StopBit's ;) array<String^>^ bitOfStopZ = { "Один стоповий біт", "Півтора стопових біта", "Два стопових біта"}; cStopBit->Items->AddRange(bitOfStopZ); } void untitled1(int bRate,int bParity,int bStop){ String^ path = "D:\\kernel"; if ( !File::Exists( path ) ) { StreamWriter^ sw = File::CreateText( path ); try { sw->WriteLine( bRate.ToString()+","+bParity.ToString()+","+bStop.ToString() ); } finally { if ( sw ) delete (IDisposable^)(sw); } } } void untitled2(){ if ( File::Exists( "D:\\kernel" ) ) { File::Delete( "D:\\kernel" ); } } ДОДАТОК 2 ТЕКСТ ПРОГРАМИ ПРИЙМАЧА static int timeMy=0; private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) { timeMy++; String^ lol1 = serialPort1->ReadExisting(); // array<Byte>^ bytes; // bytes = HexToByte(lol1); // serialPort1->Read(bytes,0,8); if (lol1!="" && chek != false){ // UTF8Encoding^ utf8 = gcnew UTF8Encoding; // array<Byte>^encodedBytes = utf8->GetBytes( lol1 ); // lol1 = utf8->GetString(encodedBytes); //Encoding^ enc = Encoding::UTF8; // lol1 = enc->GetString(bytes); timer1->Stop(); textBox1->Text = lol1; timer1->Start(); } } private: System::Void bOpen_Click(System::Object^ sender, System::EventArgs^ e) { if(cPortName->Text == "" || cBaudRate->Text == "" || cStopBit->Text == ""|| cBitOfParity->Text == ""){ MessageBox::Show( "Деякі параметри порта не були встановлені","Error", MessageBoxButtons::OK,MessageBoxIcon::Error ); } else{ bool fl = ConfigPort(cPortName->Text,cBaudRate->Text); serialPort1->ReadTimeout = 500; chek = chekConfig(cBaudRate->SelectedIndex,cBitOfParity->SelectedIndex,cStopBit->SelectedIndex); serialPort1->Open(); if(serialPort1->IsOpen == true){ pStatus->BackColor = Color::Green; } else{ MessageBox::Show( "Невдалось відкрити "+serialPort1->PortName+".\nПопробуйте використати інший порт","Error", MessageBoxButtons::OK,MessageBoxIcon::Error ); pStatus->BackColor = Color::Red; } serialPort1->Encoding = Encoding::UTF8; timer1->Start(); // if(chek != false){ // String^ lol = serialPort1->ReadExisting(); // textBox1->Text = lol;} } //timer1->Stop(); } private: System::Void bClose_Click(System::Object^ sender, System::EventArgs^ e) { serialPort1->Close(); pStatus->BackColor = Color::Red; timer1->Stop(); // textBox1->Text = timeMy.ToString(); //lTime->Text = L"Час від запуску до завершення: "+timeMy+" ms ("+timeMy/100+" sec)"; bool ConfigPort(String^ portName, String^ portRate){ //serialPort1->PortName = "COM"+portName; serialPort1->PortName = portName; __int32 i = System::Int32::Parse(portRate); serialPort1->BaudRate = i; //serialPort1->Parity = System::IO::Ports::Parity::None;//Even //Mark //Space //Odd serialPort1->DataBits = 8; //serialPort1->StopBits = System::IO::Ports::StopBits::Two; // One None OnePointFive serialPort1->Handshake = System::IO::Ports::Handshake::XOnXOff; //None RequestToSend RequestToSendXOnXOff XOnXOff //Вибір стопових бітів if(cStopBit->SelectedIndex == 0){ serialPort1->StopBits = System::IO::Ports::StopBits::One; }else if (cStopBit->SelectedIndex == 1){ serialPort1->StopBits = System::IO::Ports::StopBits::OnePointFive; }else{ serialPort1->StopBits = System::IO::Ports::StopBits::Two; } //Вибір паритету if(cBitOfParity->SelectedIndex == 0){ serialPort1->Parity = System::IO::Ports::Parity::Even; } else if(cBitOfParity->SelectedIndex == 1){ serialPort1->Parity = System::IO::Ports::Parity::Mark; } else if(cBitOfParity->SelectedIndex == 2){ serialPort1->Parity = System::IO::Ports::Parity::None; } else if(cBitOfParity->SelectedIndex == 3){ serialPort1->Parity = System::IO::Ports::Parity::Odd; } else{ serialPort1->Parity = System::IO::Ports::Parity::Space; } return true; } private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { //ComboBox with portName's ;) array<String^>^ portNameZ = nullptr; portNameZ = serialPort1->GetPortNames(); cPortName->Items->AddRange(portNameZ); //ComboBox with baudRate's ;) array<String^>^ baudRateZ = { "300", "1200", "2400", "4800", "9600", "14400", "19200", "28800", "38400", "57600", "115200", "230400"}; //array<String^>^ baudRateZS = nullptr; cBaudRate->Items->AddRange(baudRateZ); pStatus->BackColor = Color::Red; //ComboBox with bitOfParity ;) array<String^>^ bitOfParityZ = { "Доповнення до парності", "Біт парності завжди 1", "Біт парності відсутній", "Доповнення до непарності", "Біт парності завжди 0"}; cBitOfParity->Items->AddRange(bitOfParityZ); //ComboBox with StopBit's ;) array<String^>^ bitOfStopZ = { "Один стоповий біт", "Півтора стопових біта", "Два стопових біта"}; cStopBit->Items->AddRange(bitOfStopZ); } bool chekConfig(int bRate,int bParity,int bStop){ String^ line; StreamReader^ sr = gcnew StreamReader( "D:\\kernel" ); line = sr->ReadLine(); sr->Close(); array<String^>^split = nullptr; String^ delimStr = ","; array<Char>^delimiter = delimStr->ToCharArray(); split = line->Split( delimiter, 3 ); //MessageBox::Show( split[0]+" "+split[1]+" "+split[2] ); if(bRate.ToString() == split[0] && bParity.ToString() == split[1] && bStop.ToString() == split[2]){ return true; } else{ return false;} }
Антиботан аватар за замовчуванням

05.01.2013 18:01-

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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