Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Лабораторна робота №1-4
з Периферійних пристроїв, інтерфейсів та драйверів
на тему: «Дослідження режимів функціонування інтерфейсу RS-232C»
МЕТА РОБОТИ: ознайомитися з процесом передачі даних через послідовний асинхронний інтерфейс RS-232C (COM-порт).
Короткі теоретичні відомості
Асинхронний послідовний інтерфейс – це основний тип інтерфейсу, за допомогою якого здійснюється передача даних між комп’ютерами. Термін асинхроний означає, що при передачі даних не використовуються ніякі синхронізуючі сигнали, і окремі символи можуть передаватись з випадковими інтервалами, як, наприклад при вводі даних з клавіатури.
Кожному символу, який передається через послідовне з’єднання, мусить передувати стандартний стартовий сигнал, а завершувати його передачу – стоповий сигнал. Стартовий сигнал – це нулевий біт, його ще називають стартовим бітом. Його призначення – повідомити пристою, який приймає дані про те, що наступні вісім бітів представляють собою байт даних. Після символа передаються один чи два стопових біта, які дають сигнал про закінчення передачі символа. В пристрої який приймає дані, символи розпізнаються по появі стартових і стопових сигналів, а не по моменту їх передачі. Асинхроний інтерфейс орієнтований на передачу символів (байтів), а при передачі використовується приблизно 20% інформації тільки для ідентифікації кожного символа.
Інтерфейс 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.
Рис.3 Формат даних RS-232C
Всі сигнали RS-232C передаються спеціально вибраними рівнями, що забезпечують високу завадостійкість зв'язку (рис.6). Відзначимо, що дані передаються в інверсному коді (логічній одиниці відповідає низький рівень, логічному нулю - високий рівень).
Рис. 6 Рівні сигналів RS-232C на передавальному і приймаючому кінцях лінії зв'язку.
Лабораторна робота № 1
Створення програми передавача пакетних даних
через COM порт .
МЕТА РОБОТИ: ознайомитися з процесом створення програми передавача пакетних даних через послідовний асинхронний інтерфейс RS-232C (COM-порт).
Хід роботи
Створюємо програму симулятора передавача даних через COM порт в Visual Studio 2017 з допомогою платформи .Net. Для цього використовуємо Windows Form яка має вигляд Рис.1.
Рис. 1. Інтерфейс програми
Підключаємо COM порт за допомогою бібліотеки System.IO.Ports.
Виклик методів компорта здійснюємо наступним чином:
ComPort.Open()- метод призначений для відкривання COM порта;
ComPort.Write(buffer, 0, buffer.Length) – метод який пересилає дані з компорта;
buffer – масив типу byte з 8 значень в який зберігаємо байт символу;
ComPort.Close() - метод призначений для закриття COM порта;
ComPort.BytesToRead – зчитує максимальну кількість байтів які передаються;
ComPort.ReadByte() – зчитує один байт з буфера порта.
Самостійно створюємо методи які потрібні для робти програми:
private void SendInf_Click(object sender, EventArgs e) – передає дані які введені в текстове поле DataToSend.Text за допомогою COM порта;
private void BaudRate_TextChanged(object sender, EventArgs e) – вказує швидкість з якою працює COM порт;
private void Form1_Load(object sender, EventArgs e) – перевіряє чи введено значення характеристики порта(номер і швидкість);
private void DataToSend_TextChanged(object sender, EventArgs e) – задає кількість символів які будуть передаватися;
private void Form1_Paint(object sender, PaintEventArgs e) – передає значення символів які потрібно намалювати;
static public void Drawing(System.Windows.Forms.DataVisualization.Charting.Chart frm, byte buf, int speed) – малює графік одного символа;
private void COMNum_TextChanged(object sender, EventArgs e) – перевіряє чи правильний номер порта буде використовуватися.
Далі прописуємо роботу програми яка буде здійснюватися за заданим алгоритмом Рис.2.
Рис.2 Блок-схема алшоритму роботи Передавача.
Після виконання попереднього пункту тестуємо програму, на Рис.3 зображений скріншот роботи програми по передаванню даних між COM портаи.
Рис.3 Скріншот роботи Передавача.
Висновок: навчився створювати програму передавача пакетних даних через СОМ порт.
Лабораторна робота № 2
Створення програми приймача пакетних даних
через COM порт .
МЕТА РОБОТИ: ознайомитися з процесом створення програми приймача пакетних даних через послідовний асинхронний інтерфейс RS-232C (COM-порт).
Хід роботи
Створюємо програму симулятора приймача даних за допомогою COM порта в Visual Studio 2017 з допомогою платформи .Net. Для цього використовуємо Windows Form яка має вигляд Рис.4.
Рис.4. Інтерфейс програми
Підключаємо COM порт за допомогою бібліотеки System.IO.Ports, з даної бібліотеки використовуємо такі самі методи як і при створенні приймача.
Самостійно створюємо методи які потрібні для робти програми:
private void COMNum_TextChanged(object sender, EventArgs e) – перевіряє чи правильний номер порта буде використовуватися;
private void BaudRate_TextChanged(object sender, EventArgs e) – вказує швидкість з якою працює COM порт;
private void Form1_Load(object sender, EventArgs e) – перевіряє чи введено значення характеристики порта(номер і швидкість);
private void timer_Tick(object sender, EventArgs e) – зчитує дані з буфера потра і записує в поле даних;
private void Form1_Paint(object sender, PaintEventArgs e) – передає значення символів які потрібно намалювати;
static public void Drawing(System.Windows.Forms.DataVisualization.Charting.Chart frm, byte buf, int speed) – малює графік одного символа.
Далі прописуємо роботу програми яка буде здійснюватися за заданим алгоритмом Рис.5.
Рис.5 Блок-схема алшоритму роботи Приймача.
Після виконання попереднього пункту тестуємо програму, на рис.6 зображений скріншот роботи програми по приймача даних між COM портаи.
Рис.6 Скріншот роботи програми Приймача
Висновок: навчився створювати програму передавача пакетних даних через СОМ порт.
Лабораторна робота № 3
Відтворення передані та прийому інформації через COM порт у графічному вигляді.
МЕТА РОБОТИ: ознайомитися з процесом формування та передачі пакетних даних у графічному представленні через послідовний асинхронний інтерфейс RS-232C (COM-порт).
Хід роботи
Для того, щоб ознайомитись з передачею даних в графічному вигляді через інтерфейс RS-232C, я використав колекцію Chart з платформи .Net.
Рис. 7. Графік передачі символа(sender) ‘P’ через COM-port
Рис. 8. Графік прийому символа(receiver) ‘P’ через COM-port
На даному графіку поданий графік передачі даних, який включає стартовий біт, інформаційні біти, біт контролю, і 2 біти завершення.
Вхідні дані: Pylypiak
8-бітні ASCII коди кожного символа:
P – 0101 0000
y – 0111 1001
l – 0110 1100
y – 0111 1001
p – 0111 0000
i – 0110 1001
a – 0110 0001
k – 0110 1011
Кожен символ передається за допомогою 12 бітів. При швидкості 9600 біт/с, час передачі одного біта: 1/9600 = 0,0001 с.
Тоді час передачі одного символа (байта) 12*0,0001с=0,0012с.
Повідомлення складається з 8 бітів тому загальний час передачі повідомлення складає 8*0,0012=0,0096с.
Для малювання графіка створюємо класс static class charting та метод static public void Drawing(System.Windows.Forms.DataVisualization.Charting.Chart frm, byte buf, int speed)
Висновок: навчився формувати графік пакетних даних які передаються або приймаються СОМ-портом.
Лабораторна робота № 4
Налаштування портів на передачу та прийом
інформації через COM порт.
МЕТА РОБОТИ: ознайомитися з процесом налаштування основних параметрів прийому – передачі пакетних даних через послідовний асинхронний інтерфейс RS-232C (COM-порт).
Хід роботи
Щоб з’єднати два віртуальні порти , вибираємо тип з’єднання типу ‘пара’.
Рис. 9. Вікно вибору типу з’єднання
Після вибору типу з’єднання, запускаємо емуляцію COM порта.
Рис.10. Вікно запуску емуляції
Після в цього можемо налаштувати швидкість передачі порта в програмі і відкрити його.
Рис. 11. Налаштування інтерфейсу RS-232C в програмі
Рис.12 Блок-схема алгоритму налаштування симуляції СОМ-порта.
Висновок: навчився налаштовувати основні параметри прийому – передачі даних через послідовний асинхронний інтерфейс RS-232C (COM-порт).
Додаток 1.
Код програми передавача:
private void SendInf_Click(object sender, EventArgs e)
{
byte[] buffer = Encoding.UTF8.GetBytes(DataToSend.Text);
try
{
ComPort.Open();
ComPort.Write(buffer, 0, buffer.Length);
ComPort.Close();
}
catch (System.IO.IOException)
{
MessageBox.Show("Неправильні налаштування", "Помилка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (System.UnauthorizedAccessException)
{
MessageBox.Show("Порт " + ComPort.PortName + " неможливо відкрити", "Помилка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void COMNum_TextChanged(object sender, EventArgs e)
{
if (ComPort.IsOpen == true)
ComPort.Close();
try
{
ComPort.PortName = "COM" + COMNum.Text;
ComPort.Open();
ComPort.Close();
}
catch (System.IO.IOException)
{
MessageBox.Show("Неправильний номер порту", "Помилка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (System.UnauthorizedAccessException)
{
MessageBox.Show("Порт " + ComPort.PortName + " неможливо відкрити", "Помилка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void BaudRate_TextChanged(object sender, EventArgs e)
{
if (ComPort.IsOpen == true)
{
ComPort.Close();
ComPort.BaudRate = int.Parse(BaudRate.Text);
}
}
private void DataToSend_TextChanged(object sender, EventArgs e)
{
ByteNum.Maximum = DataToSend.Text.Length;
if (ByteNum.Value > ByteNum.Maximum)
ByteNum.Value = ByteNum.Maximum;
}
private void Form1_Load(object sender, EventArgs e)
{
ByteNum.Maximum = DataToSend.Text.Length;
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
if (ByteNum.Value - 1 >= 0)
{
byte[] buffer = Encoding.UTF8.GetBytes(DataToSend.Text);
int speed = 0;
speed = int.Parse(BaudRate.Text);
charting.Drawing(chart1, buffer[(int)(ByteNum.Value - 1)], speed);
}
}
private void ByteNum_ValueChanged(object sender, EventArgs e)
{
if (ByteNum.Value - 1 >= 0)
{
byte[] buffer = Encoding.UTF8.GetBytes(DataToSend.Text);
int speed = 0;
speed = int.Parse(BaudRate.Text);
charting.Drawing(chart1, buffer[(int)(ByteNum.Value - 1)], speed);
}
}
Додаток 2.
Код програми приймача:
private void timer_Tick(object sender, EventArgs e)
{
if (ComPort.IsOpen == true)
{
if (ComPort.BytesToRead != 0)
{
RecData.Text = "";
ByteNumber.Maximum = ComPort.BytesToRead;
while (ComPort.BytesToRead != 0)
{
byte[] b = BitConverter.GetBytes(ComPort.ReadByte());
RecData.Text += Encoding.UTF8.GetString(b);
}
}
}
}
private void ByteNumber_ValueChanged(object sender, EventArgs e)
{
if (ByteNumber.Value - 1 >= 0)
{
byte[] buffer = Encoding.UTF8.GetBytes(RecData.Text);
int speed = 0;
speed = int.Parse(BaudRate.Text);
charting.Drawing(chart1, buffer[(int)(ByteNumber.Value - 1)], speed);
}
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
if (ByteNumber.Value - 1 >= 0)
{
byte[] buffer = Encoding.UTF8.GetBytes(RecData.Text);
int speed = 0;
speed = int.Parse(BaudRate.Text);
charting.Drawing(chart1, buffer[(int)(ByteNumber.Value - 1)], speed);
}
}
Додаток 3.
Код програми яка малює графік:
static class charting
{
static public void Drawing(System.Windows.Forms.DataVisualization.Charting.Chart frm, byte buf, int speed)
{
int i = 0;
buf *= 2;
bool par = (buf & 0x80) == 0;
frm.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
frm.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
frm.Legends.Clear();
frm.Series[6].Points.AddXY(0, 0);
frm.Series[6].Points.AddXY(12, 0);
frm.Series[1].Points.AddXY(0, -25);
frm.Series[1].Points.AddXY(12, -25);
frm.Series[2].Points.AddXY(0, 25);
frm.Series[2].Points.AddXY(12, 25);
frm.Series[0].Color = Color.Red;
frm.Series[0].Points.AddXY(i, -25);
frm.Series[0].Points.AddXY(i + 1, -25);
frm.Series[3].Points.AddXY(i + 1, -25);
for (i = 1; i <= 8; i++)
{
if ((buf & 0x80) == 0)
{
frm.Series[3].Points.AddXY(i, 25);
frm.Series[3].Points.AddXY(i + 1, 25);
}
else
{
frm.Series[3].Points.AddXY(i, -25);
frm.Series[3].Points.AddXY(i + 1, -25);
}
buf *= 2;
par = par ^ (buf & 0x80) == 0;
}
if (!par)
{
frm.Series[3].Points.AddXY(i, -25);
frm.Series[4].Points.AddXY(i, -25);
frm.Series[4].Points.AddXY(i + 1, -25);
}
else
{
frm.Series[3].Points.AddXY(i, 25);
frm.Series[4].Points.AddXY(i, 25);
frm.Series[4].Points.AddXY(i + 1, 25);
}
i++;
frm.Series[4].Points.AddXY(i, 25);
frm.Series[5].Points.AddXY(i, 25);
frm.Series[5].Points.AddXY(i + 2, 25);
}
}