''Основната причина за съществуване на различни типове данни е да знае компилатора, колко памет да отдели за всяко число, буква или текст, когато съхранява стойностите им. Информацията се ползва и в последствие, при извеждане или при обработка на данните и взаимодействия с други данни.''
3. Създайте програма, която да извежда всички букви букви от ASCII кода в поредица AbCdEfGh.... yZ
'' '''Упътване''' . Всяка буква отговаря на число, всяка следваща буква е число с едно по-голямо. Главните букви започват от 65, малките от 97, а общо са 26. Може да ползвате:''
<code><pre>
int x = 65;
char y;
y = (char) x;
printf( " %c ", y );
int i = 0;
for (i = 0; i< 26; i = i + 2)
{ ... }
</pre></code>
4. Създайте програма, която след въвеждане на буква от клавиатурата, извежда дали кодът на буквата е с четен или нечетен номер.
'' '''Упътване.''' Може да използвате примера от [[Упражнение 2. Достъп до периферни устройства.|задача 2 на Упражнение 2]] и кодът по-долу.''
<code><pre>
if ( ((int) s) % 2) puts(" .... ");
else puts(" ... ");
</pre></code>
5. Изпълнете програматаза преобразуване на буква в двоичен код, разгледайте кода и пробвайте с различни букви.
<code><pre>
#include <stdio.h> /* Standard input/output definitions */
#define TESTD 'a'
int main(void)
{
int z=128, y = 0;
char a = TESTD;
char b[9] = "00000000";
for ( y=0; y < 8; ++y)
{
b[y] = ((a & z) == z) ? '1' : '0';
/* a = 0 0 1 0 1 0 0 0
AND
z = 0 0 0 0 1 0 0 0
===================
r = 0 0 0 0 1 0 0 0 = z */
z = z >> 1; // <=> z >>= 1 - преместване с един бит
}
printf("%s \n", b);
return 0;
}
</pre></code>
'''Проверка по четност'''
6. Преработете кодът от предната задача, така че да ви показва, колко единици има в двоичното число и дали броят на единици е четен или нечетен.
*[http://superuser.com/questions/122353/how-can-i-login-to-ubuntu-using-a-usb-serial-port USB сериен порт UBUNTU > 10.4]
*[http://versalogic.com/kb/KB.asp?kbid=1551 конфигуриране терминал в Debian с Getty]
'''Задача''' Влезте в Ubuntu през системнатa конзола и тествайте командите:
*reboot,
*halt,
*shutdown.
== [[Управление на сериен порт с POSIX|Комуникация през C, POSIX и сериен порт]] ==
'''Задача ''' Тествайте програмата, която изпраща информация по-серийния порт. Свържете два компютъра със сериен кабел, като на единия изпълнявате програмата, а на другия сте включили, някоя от терминалните програми за управление на серийната връзка от предходната задача. Тествайте с различни съобщения.
<code><pre>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <fcntl.h>
#include <termios.h>
void handler(int nsig)
{
int status;
//wait for change in child
wait(&status);
if(WIFEXITED(status))
{ //if child is exited
printf("Thank You!\n");
exit(0);
}
}
int main()
{
int pid, serial;
char ch;
struct termios oIn, nIn, oSerial, nSerial;
//open serial port
serial = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
// Signal handler
(void) signal(SIGCHLD, handler);
// Current configuration
tcgetattr(0,&oIn);
tcgetattr(0,&nIn);
tcgetattr(serial,&oSerial);
tcgetattr(serial,&nSerial);
// Raw mode
nIn.c_lflag = 0;
nSerial.c_lflag = 0;
// Set new configuration
tcsetattr(0, TCSANOW, &nIn); //stdin
tcsetattr(serial, TCSANOW, &nSerial);
write(1,"For exit press \'q\' \n", 20);
fflush(stdout);
fflush(stdin);
// Create new process
pid = fork();
while(1)
{
if(pid < 1)
{ // child process
read(0,&ch,1); // read stdin
write(serial,&ch, 1); //write to serial port
if(ch == 'q')
{
tcsetattr(0, TCSANOW, &oIn); //restore original configuration
options.c_cflag |= ( CLOCAL); // Local line - do not change "owner" of port
options.c_cflag &= ( ~CSTOPB); // set 1 stop bit
tcsetattr(fd,TCSANOW, &options); // load the controller settings
write(fd, "a \n", 3); //write to 3 byte to the serial port
return 0;
}
</pre></code>
За повече информация [[Управление на сериен порт с POSIX]], [http://www.easysw.com/~mike/serial/serial.html POSIX serial port]
== Осцилограма ==
'''Задача''' Създайте програма с безкраен цикъл, която да изпраща една буква към серийния порт. Използвайте специално пригодения кабел и разгледайте осцилограмата на сериен сигнал.
Интерфейсът RS-232 е с повече от половин век история и в момента когато казваме "сериен порт" най-често става дума за RS-232. В сравнение със съвременните мегабитови интерфейси като USB (също сериен интерфейс), RS-232 връзката изглежда бавна и ненужна, но тя e същественa поради няколко причини:
За разбиране на процеса на комуникация с операционната система. Текстовият интерфейс е в основата на всяка една операционна система, а той e базиран върху концепцията на серийния терминал. Днес хардуерният текстов терминал е заместен с псевдо терминал.
Псевдо терминал LinuxASR-33 TeleTYpeVT05 Първият терминал с екран
Все още се ползва, въпреки че е загубила широката си употреба. Серийния интрефейс се среща за връзка с индустриални контролери и комуникационна апаратура.
USB, Bluetooth, IrDA предлагат средства за емулиране на RS232 серийна връзка
DB-25DB-9RJ-45
Повечето серийни интерфейси с ниска скорост са някакъв вариант на RS-232C стандарта. Този стандарт определя електрическите характеристики и значението на сигнала по всеки от проводниците, както и разположението на пиновете в традиционния 25 пинов конектор (DB-25p фиг.4).
Пълният стандарт RS-232C (EIA-232-E, ITU-T V.24) реално не се използва, защото определя множество сигнали, които са ненужни при обикновена комуникация. DB-25 конекторите са неудобни и поради големината си. В резултат на това те са заместени от 9 пинов конектор (DB-9, фиг.5), а като удобна алтернатива се ползва и RJ-45.
В таблицата са дадени наименованията на сигналите и разположението им на пиновете. Обикновено се ползват 7 проводника за осъществяване на връзка (DSR и DCD; FG и SG; ползват общ проводник).
Таблица със значенията на пиновете (мъжки куплунг) за различните конектори.
DB-25
DB-9
RJ-45
Име
Значение
1
-
-
FD
Frame Ground
2
3
6
TD
Transmitted Data
3
2
5
RD
Received Data
4
7
8
RTS
Request To Send
5
8
7
CTS
Clear To Send
6
6
1
DSR
Data Set Ready
7
5
4
SG
Signal Ground
8
1
2
DCD
Data Carrier Detect
20
4
3
DTR
Data Terminal Ready
На фигури 4,5 и 6 са дедени разположенията на мъжките пинове, в женския конектор те са разположени огледално.
Свързване
При свързване на две устройства с RS-232 сигналът за предаване (TD) от едно устройство трябва да се подава на пин за приемане (RD) на второто устройство. Поради това сa предложени два типа конфигурации на серийните устройствата:
DTE (Data Terminal Equipment) - формално управлява връзката (master) стандартна схема на свързване
Всяко едно устройство може да е конфигурирано или като DTE или като DCE, рядко може да поддържа и двата варианта, но не в един и същ момент.
Когато устройствата са еднотипни за връзка между тях трябва да се ползва кръстосан кабел, наречен още null modem кабел. За връзка DТE-DCE се ползва прав кабел. Съществува и трета разновидност на кабели използвана при cisco апаратура наречени "rollover" кабели, при които изводите в единия край са огледално пренаредени в другия.
Конфигурация на Null Modem кабел
DB9-1 пин/проводник
DB9-2 пин/проводник
Receive Data
2
3
Transmit Data
Transmit Data
3
2
Receive Data
Data Terminal Ready
4
6+1
Data Set Ready + Carrier Detect
System Ground
5
5
System Ground
Data Set Ready + Carrier Detect
6+1
4
Data Terminal Ready
Request to Send
7
8
Clear to Send
Clear to Send
8
7
Request to Send
Скорост на предаване
За успешна комуникация скоростта на предаване на едното устройство трябва да е равна на скоростта на приемане на второто устройство. Повечето серийни контролери не поддържат автоматичен избор на скоростта, затова се налага ръчна конфигурация за съгласуване на двете устройства.
Поддържаните скорости зависят от серийния контролер, обикновено са в границите между 50 bit/s - 115200 bit/s.
Възможна е асиметрична връзка (скоростта в двете посоки (Up/Down link) е различна).
Понякога името на параметъра дефиниращ скоростта се нарича baud - бод. Идва от машините с перфолента, като скоростта се измерва в колко бода (продупчвания) могат се правят за секунда.
Проверка по четност
Към изпращания символ може да се добави един бит за откриване на грешки възникнали при предаване на сигнала. Възможни са три конфигурации:
проверка по четност
проверка по нечетност
без бит за проверка
Брой битове
Възможни са различни конфигурации на за броя битове в един символ. Най-често се използва 8 бита съответсващи на един байт. Използват и 7 бита от които са достатъчни за един ASCII символ.
Старт/стоп битове
След всеки предаден символ линията се поставя в ниско ниво с продължителност от 1, 1.5 или 2 бита.
За начало на предаване пред всеки символ линията се поставя в високо ниво с продължите от 1 бит.
FLOW CONTROL
При препълване на входните буферите може да се поиска спиране на предаването. Може да се реализира софтуерно и хардуерно.
При софтуерна реализация (Xon/Xoff) по линията (RD/TD) от приемника се изпращат специални символи, които трябва да известят предаващата страна за спиране или възстановяване на предаването.
При хардуерна реализация се ползват линиите RTS/CTS или DTR/DSR. За да има предаване двете линии трябва са да във високо ниво.
Задача: връзка DTE-DTE / Windows-Linux
Задача. Свържете два компютъра един с Ubuntu OS и един Windows OS с кръстосан сериен кабел(null modem) през RS232 порта. Настройте съответно двете програми GTKterm и PuTTY да предават и приемат с еднакви параметри. Тествайте да си обменяте съощения. Тествайте различни настройки за скорости на предаване, проверка по четност и т.н.
Упътване
За Ubuntu:
Инсталирайте терминалната програма за комуникация през сериен порт GTKterm. Използвайте командата
:~$ sudo apt-get install gtkterm
След инсталацията може да намерите програмата в Applications -> Accessories.
направете съответните настройки
За Windows
Свалете от Internet програмата Putty
Стартирайте Putty и направете съответните настроийки