Konu: Seri Port
Tekil Mesaj gösterimi
Alt 06-09-2008, 12:58   #1
Constantin
ยŦยк
 
Constantin - ait Kullanıcı Resmi (Avatar)
 
Seri Port

BİLGİSAYAR TABANLI VERİ TOPLAMA | SERİ PORTLAR
Paralel port her zaman en iyi çözüm değildir. Zaten bir tasarımcı için her şarta uyum sağlayan tek bir çözümden bahsedilemez. Çözümler şartlara göre geliştirilir ve iyileştirilir. Örneğin hızın çok önemli olmadığı bunun yanında uygun arayüzün harici sistemde bulunduğu durumlarda seri port kullanımı zorunluluk da olabilir.
Günümüz modern bilgisayarları ve sistemleri çok sayıda seri haberleşme arayüzleri içermektedir. Özellikle USB portları hem yüksek hızları hem de uygun kablo ve soket sunmaları nedeniyle tüm dünyada yaygın olarak kullanılmaktadır. USB seri arayüzünün RS-232 seri portunu tahtından ettiğini kolaylıkla söyleyebilir ancak daha önce üretilen ve USB'ye göre son derece basit olan RS-232'nin bilgisayarlardan tamamen kalkması daha uzun yıllar alabilir.
Bunların yanında Firewire olarak bilinen diğer bir seri arayüz de mevcuttur. İlk tasarlandığında USB arayüzü ile arasındaki hız farkı son yıllarda USB'nin lehine kapanmıştır. Önümüzdeki yıllarda USB 2.0 480Mb/s hızına ulaşacaktır ki bu hız Firewire ulaşacağı en son hız olan 400Mb/s den daha fazladır.
Aşağıda bir dizüstü bilgisayarda bulunan RS-232 portuna bağlanmış RS-232 kablo ve fişi (DB-9F) görülmekte iken solda ise bağlantısız şekildeki soket (DB9-M) ve fiş beraber görünmektedir.

http://www.wekatronik.com/resimler6/seri_conn.jpg
Dizüstü bilgisayarlar teknolojiyi en hızlı takip eden bilgisayar türlerindendir. Örneğin LCD ekranlar onların sayesinde kullanıcı ile tanışmıştır. Aynı zamanda çoğu uygulama da ilk defa dizüstü bilgisayarlarda ortaya çıkmıştır. Bu aynı zamanda dizüstü bilgisayarlarda eski teknolojilerin de hızla terk edildiği anlamına gelir. Örneğin çoğu modern dizüstüler artık disket sürücüsüz olarak piyasa çıkmaktadır. USB bellekler disket sürücüleri kullanım dışına itmişlerdir. Ancak konu RS-232'ye geldiğinde dizüstüler hala muhafazakar davranmaktadırlar, bu teknolojik işaret bile basit ve temel haberleşme arayüzlerinin uzun süre bilgisayarlar ile beraber kalacağını göstermektedir.
Şimdi, diğer seri ve paralel iletişim sistemleri ile beraber RS-232'yi karşılaştıralım. Aşağıdaki tabloda çeşitli ölçütlere göre çeşitli haberleşme sistemlerinin detaylarını bulacaksınız.


http://www.wekatronik.com/resimler6/tablo1.jpg
Kişisel bilgisayarlarda kullanılan iletişim arayüzleri

Tablodan görüldüğü gibi RS-232 sadece kablo uzunluğunun önemli olduğu uygulamalar için uygundur. Hız bakımından, yeni teknolojiler karşısında oldukça yavaş kaldığı söylenebilir. Ancak hız istenmeyen bir çok uygulama da mevcuttur. Örneğin bir turnikeden geçen insanların sayısını ve bilgilerini toplayan bir sistemde, bilgisayar ile turnike cihazının haberleşmesi için RS-232 yeterli ve hatta RS-232 bu tip uygulamalar için oldukça hızlıdır. Diğer bir örnek, bir mikrodenetleyici çipini programlamak istiyorsak RS-232 arayüzü yine yeterli gelecektir. Zira mikrodenetleyicilerin içerdiği kod miktarı bit cinsinden birkaç yüz kilo bittir. Bu sayıda biti transfer etmek için birkaç saniye yeterlidir ve geçen bu kısa süre çipi programlayan kişiyi rahatsız etmeyecektir.
Seri haberleşmede tek bir kablo üzerinden veriler sıra ile gönderilir. Benzetmek gerekirse bir lokomotife bağlı vagon gibi hareket ederler. Raylar da verileri taşıyan kabloya benzetilebilir. Aşağıdaki şekilde RS-232 haberleşmesinin bir baytlık kısmı görülmektedir.

http://www.wekatronik.com/resimler6/image007.gif
RS-232 Seri Haberleşme Çerçevesi
Seri haberleşme protokollerinde veriler bit tabanlı olarak değil çerçeve tabanlı olarak iletilirler. RS-232, verileri baytlar (8-bit) halinde alır ve gönderirken, Ethernet'in her çerçevesinde 255 baytlık bilgi mevcuttur. Seri haberleşme o kadar önemlidir ki, günümüzde kullanılan tüm Internet ağı seri kablolar (fiber optik veya bakır) kullanarak haberleşmeyi sağlar. Aslında protokol denilen şey de budur. Tüm seri haberleşme sistemleri buna benzer bir mekanizma sayesinde anlaşabilirler, anlaşabilmek için protokollerinin ya aynı olması ya da bir diğerini anlayacak bir protokol olması gerekir.
Internet ağında yüzlerce protokol bulunmaktadır ve bunların beraber kullanılmaları aşılamaz sorunlar değildir. Protokolleri, insanlar arasında konuşulan dillere benzetebiliriz..Nasıl iki farklı konuşan insanı anlaştırabilmek için tercümanlar kullanıyor isek, iki farklı protokolü de anlaştırmak için kullanılan cihazlar (bridge, gateway) mevcuttur.
Tek bir kabloya bağlı cihazların hangisinin o anda veri yolunu (kabloyu) kullanacağına protokol karar verir. Aslında protokol önceden belirlenmiş kurallar bütünüdür. Bu sayede kablo üzerinde birden fazla birim hak iddia edemez (etseydi kaos oluşurdu).
Senkron ve asenkron olarak haberleşme sistemlerini ikiye ayırabiliriz. Senkron haberleşme zamanı referans alarak yapılan haberleşmedir. Veri ile birlikte zaman bilgisi de hatta yayılır, böylece hatta bağlı olan tüm sistemler zamana bağlı olarak haberleşebilirler. Asenkron haberleşme ise (ki RS-232 böyledir) sadece gönderilen çerçevedeki bitleri kullanarak senkronizasyonu sağlamaya çalışır, başka bir değişle hariçten bir sinyal almadan bu işlemi gerçekleştirir. Şekil 7.3'te senkron çalışan bir seri haberleşme sistemi görülmektedir. I2C (Entegreler Arası Haberleşme) denilen bu protokol özellikle evlerimizde bulunan elektronik cihazların içlerinde kablo karmaşasından kurtulmak için geliştirilmiş bir protokoldür.

http://www.wekatronik.com/resimler6/image009.jpg

Senkron bir haberleşme protokolü: I2C

Kişisel bilgisayarlar üzerinde bulunan RS-232 portu modem ve diğer cihazlarla haberleşebilmek için asenkron bir veri transfer yöntemi kullanır. Ancak çerçeveleri formatı farklı uygulamalar için değişebilir. Bu formatlardan en çok kullanılanı 8-N-1 formudur. Gönderilen her bayt bir START biti ile başlar bunu 8-bit veri takip eder ve çerçeve STOP biti ile son bulur. Şekil 7.2'de bu formatı temsil etmektedir.
N harfi en kolay ve basit hata yakalama metodu olan eşlik (parity) bitinin çerçevede bulunmadığın bildirir. Diğer formatlarda eşlik biti tek (odd) veya çift (even) eşlik biti olarak kullanılabilir. Tek eşlik bitinde, veri bitlerindeki Lojik 1'lerin sayısı çift ise ; eşlik biti 1 değilse 0 olur. Çift eşlik bitinde, veri bitlerindeki Lojik 1'lerin sayısı tek ise ; eşlik biti 1 değilse 0 olur. Aslında eşlik biti isminden de anlaşılacağı gibi tek eşlik kullanıyorsa, gelen tüm bilgideki (kendisi de dahil) 1'lerin sayısını tek, çift eşlik biti kullanıyorsa çift yapmaya çalışır.
7-E-1 formatında, çerçeve START biti ile başlar 7 adet veri bitleri ile devam eder, 1 bit eşlik bitini takiben STOP biti ile son bulur. Şekil 7.4'te görülen şekilde 7 bit veri ve eşlik (parity) biti görülmektedir. Örneğin burada tek eşlik kullanılsaydı, eşlik biti 1, çift eşlik biti kullanılsa idi 0 olacaktı. Veriyi alan karşı taraf gelen bilgideki 1'lerin sayısını kontrol eder ve ona göre gelen bilginin bozulup bozulmadığını anlara. Ancak eşlik biti çok da güvenli değildir, örneğin birden fazla bitin bozulmasını anlayamaz. Ayrıca eşlik bitinin hata düzeltme özelliği yoktur, sadece hatayı fark eder. Böyle bir durumda veri alan hedef cihaz, kaynağı uyararak bilgiyi tekrar göndermesini ister.

http://www.wekatronik.com/resimler6/image010.gif Seri haberleşmede kullanılan hız ölçüsü bit/sn'dir. Saniyede iletilen bit sayını veren bu birim, günümüzde bit/s çok yavaş bir hız kaldığından Kbit/s veya Mbit/s olarak kullanılmaktadır. Ancak RS-232 haberleşmesinde Baud denilen bir hız ölçüsü kullanılmaktadır. Baud, saniyede gerçekleşen olay veya veri transferi olarak bilinir. RS-232'de kullanılan Baud hızları aslında bit/s birimi ile aynıdır, çünkü her bir yeni olay yeni bir biti temsil eder. Ancak analog telefon hatlarında durum böyle değildir, bitleri temsil için kullanılan olay birkaç geçişten meydana geldiği için, gerçek hız daha düşüktür. Örneğin 9600 baud hızında (baud rate) 8-N-1 formatındaki bir RS-232 hattından saniyede toplam 960 bayt gönderilebilir.
UART (Universal Asynchronous Receiver/Transmitter, evrensel asenkron alıcı/verici) bilgisayarın seri portunda mikroişlemciden paralel bilgiyi seriye çevirir ve seri port üzerinden harici cihaza gönderir veya harici cihazdan gelen seri bilgiyi port üzerinden alarak mikroişlemciye iletilmek üzere paralele dönüştürür.UART genellikle bit frekansının 16 katı frekansta gelen biti örnekler. Örneğin gelen veri 300bit/s ise, UART frekansı 4800bit/s olur. START bit için 16bitlik süre bekler, daha sonra ilk biti okumak için 8bitlik süre bekler ve diğer gelen bitleri de 16 bitlik sürelerle okur.

Doğru bir okuma olması için alıcı ve verici cihazlarının frekansları birbirinden yaklaşık ±%3 oranında farklı olabilir. Bu yüzden alıcı ve verici tarafında kararlı ve sabit frekanslı sinyal üreten resonatörler veya kristal osilatörler kullanılır. Kişisel bilgisayarlarda UART çipinin frekansı 1.8432MHz. dir. Neden böyle bir frekans seçildiği bu rakamın 16'ya bölündüğü ile anlaşılabilir. 1.8432Mhz., 16'ya bölündüğünde sonuç 115,200 çıkar ki bu da RS-232 haberleşmesinde kullanılan en yüksek hızdır ve diğer bütün hızlar (19200,9600 vb.) bu hızın belirli bir tam sayıya bölünmesiyle elde edilir. Aşağıda seri port çıkışı veren bir UART kart, ve bu karta ait UART çip (kartın ortasında bulunan en büyük çip) görülmektedir.

http://www.wekatronik.com/resimler6/uart.jpgRS-232 portlu UART Seri Haberleşme KartıUART alıcı ve verici olarak üç çeşit bilgi kodlama kullanır:

<LI class=madde-imi-simge>İkilik veri (binary data)
Veriler ikilik kodda gönderilir. <LI class=madde-imi-simge>Metin verisi (text data)
Bazen metin dosyasının bir hedefe gönderilmesi durumunda kullanılır. Metin dosyaları da genelde üçe ayrılabilir: ASCII(7bit +eşlik biti) , ANSI (8-bit) ve Unicode (16bit). Bu formatta veriler yazı karakterlerinin kodları olarak gönderilir. ASCII'de toplam 128 karakter, ANSI'de toplam 256 karakter ve Unicode ise 65536 farklı karakter gönderilebilir.
ASCII Hex
Metin modu karakterlerden oluşan bir dosyayı göndermek için idealdir. Ancak ikilik (binary) verilere sahip dosyaları da karakterler ile temsil ederek gönderebiliriz. İkilik kodun kendisinin gönderilmesi yerine her bir 4 biti temsilen bir on-altılık sayının karakteri gönderilir. Örneğin 104 sayısı 0110 1000 olarak ikilik koda çevrilir.
0110= 6, 1000= 8 olur. Böylece gönderilecek karakterler tespit edilmiş olur: ASCII kod cetvelinde 6 rakam karakteri, 36'ya ve 8 rakam karakteri 38'e karşılık gelir. Bu iki bayt birbirini takip edecek şekilde ikilik olarak gönderilir. Ancak bu tür kodlamada fazladan bir bayt gönderilmiş olur ve haberleşme verimi düşmüş olur. Çok sayıda verinin gönderilmeyeceği durumlarda ise sorun oluşturmaz.
http://www.wekatronik.com/resimler6/uartchip.jpg

UART çipinin iç yapısı
Üstteki şekilde kişisel bilgisayarlarda kullanılan UART entegresinin iç yapısı görülmektedir. Bu çip, 8250 entegresinin bir türevidir. Günümüzdeki UART'lar oldukça fazla yardımcı ve bellek (FIFO) birimleri içermektedirler. Modern UART entegreleri genellikle 16550 entegresini temel almaktadırlar.
UART entegrelerinin temel görevi, paralel bilgiyi seriye ve seri bilgiyi de paralele çevirmektir.
Seri porta ait bilgilere erişmek için önce, Bilgisayarım simgesinin üzerine fare ile sağ-tıklama yapıldığında Özellikler maddesinin Donanım sekmesinden aygıt yöneticisi seçilir. Aygıt yöneticisinden Bağlantı Noktaları ve İletişim Bağlantı Noktası (COM1) veya (COM2) seçilerek UART kartının özellikleri görülebilir.

Her bir port bilgisayar tarafından bir adrese atanır ve ayrıca her biri için kesme (interrupt) numarası belirlenir. Atana adres ve kesme numaraları bilgisayar tarafından yönetilen kaynakların bir parçasıdır.
Atanan bu kaynakların zorunlu kalınmadıkça ve ne yaptığınızı bilmedikçe değiştirmeyiniz. Zira değiştirdiğiniz adres veya kesme numarası başka bir sistem tarafından kullanılıyor ise cihazların çakışması engellenemez.

Seri Port Programlama
Seri portun kullanımı bir çok yaygın programlama dilinde mümkündür ve oldukça da basittir.

VISUAL BASIC
Visual Basic'de Veri göndermek ve almak için aşağıdaki programı bir alt programa yerleştirmek yeterlidir.
'Yazı göndermek için: Dim ornekYazi as string
ornekYazi ="wekatronik"
MSComm1.Output=ornekYazi



'Yazı almak için: Dim ornekYazi as string
ornekYazi = MSComm1.Input


MSComm komutu alınan her 8-bit ANSI kodu, yazı karakteri olarak kaydeder. ASCII den Hex (16 lık sayı sistemi) ve Hex'ten ACSII'ye kod çevirimi yapmak için farklı komutlar kullanılır.
Hex$ (165) komutu sayıyı, ACSII Hex karşılığına çevirir.
Val ("&h" & "A5") komutu ACSII Hexi, sayı karşılığına çevirir.

Eğer iki baytlık bir ikilik sayı göndermek istersek:
Dim Gonderilecekler (0 to 1) As Byte
Dim Tampon As Variant
Gonderilecekler(0) =&H4A
Gonderilecekler(1) =&H23
Tampon=Gonderilecekler( )
MSComm1.Output =Tampon


C DİLİ KULLANARAK SERİ PORTA BİLGİ YAZMA-OKUMA ÖRNEK PROGRAM KODLARI

* Compile options needed: none
- The following program is a simple example which sends and receives
one character to/from COM1:
*/

#include <stdio.h>
#include <bios.h>
void main(void)
{
unsigned com1_status;
unsigned com1_send;
unsigned com1_rec;
unsigned com1_init;
int result, mask;

/* open serial port at 1200 baud, 8 data bits,
** No parity, 1 stop bit */
com1_init = _bios_serialcom(_COM_INIT, 0,
_COM_CHR8 | _COM_NOPARITY | _COM_STOP1 | _COM_1200);
printf("Init status: 0x%4.4X\n", com1_init);

/* send an '*' to com1 */
com1_send = _bios_serialcom(_COM_SEND, 0, '*');
printf("Send status: 0x%4.4X\n", com1_send);

mask = 0x6100;
/* value used to mask:
* bits 0-7 are related to modems,
* bits 8-15 are for port status,
* check to see that the following bits are set:
* 8 (data ready)
* 13 (Transmission-hold register empty)
* 14 (Transmission-shift register empty)
*/

/* check the status */
com1_status = _bios_serialcom(_COM_STATUS, 0, 0);
printf("COM1 status: 0x%4.4X\n", com1_status);

/* wait until a character is ready */
do {
/* check the status */
com1_status = _bios_serialcom(_COM_STATUS, 0, 0);

/* mask off the low order byte of com1_status */
com1_status = com1_status & 0xFF00;
} while( (mask & com1_status) == 0);

/* get a character */
com1_rec = _bios_serialcom(_COM_RECEIVE, 0, 0);
printf("Read status: 0x%4.4X\n", com1_rec);

/* print the character we just received */
result = com1_rec & 0x00FF;
printf("Character: 0x%2.2X = %c\n", result, (char)result);
}
vBulletin v3.6.4, Copyright ©20
Constantin Ofline   Alıntı ile Cevapla