RS-232

advertisement
RS
Tüm dünyada kabul edilen ve uluslararası standart haline gelmiş
bazı haberleşme ara yüzleri vardır. Bütün üreticiler bu standartlar
üzerinden haberleşme yaparak farklı marka ürünlerin birbirleriyle
haberleşmelerine olanak tanır. RS , “Recommended Standard” yani
tavsiye edilen standart kelimelerinin kısaltmasıdır.
RS-232 Seri İletişim Protokolü
İlk olarak 1962 yılında çıkmıştır ve onun üçüncü versiyonu 1969 yılında RS232C olarak adlandırılmıştır. RS-232D standardı ise RS-232C üzerinde
genişletme yapmak için 1987 yılında çıkmıştır. RS232D standardı aynı zamanda
EIA-232-D olarak da bilinir.
RS-232 C Electronic Industries Assosiation (EIA) tarafından daha bilgisayarın
başlangıç zamanları sayılan o yıllarda tasarlanmıştır. EIA‘da çalışan
mühendisler gelecek için nasıl bir şey geliştireceklerinden pek emin değillerdi.
Böylece RS-232 C standardının mümkün olduğu kadar esnek olması için çok
sayıda farklı sinyal hatları sağlamışlardır. Fakat günümüzde bu sinyal
bağlantılarının çoğu kullanılmamaktadır.
RS-232 C ile kullanılan en yaygın konnektör tipi DB25’dir. DB-25 25 pinlidir. RS232 D’de 25 hatlıdır ve DB-25 konnektörünü kullanır. D tipi konnektörlerdir. Bu
tip konnektörler D şeklinde olduğu için bu adı almışlardır.
Amerika Birleşik Devletleri dışında bu DB-25 konnektörü kablosu V.24 ve V.28
olarak bilinir. V.24 ve V.28 standartları , Consultative Committee On
International Telegraph and Telephone (CCIT) olarak bilinen Uluslararası
standartlar grubu tarafından kabul edilmiştir.
RS-232C 25 pin DB-25 konnektörü kullanması yanında bazı seri
arabirimler, daha küçük olan DB-9 konnektörünü de kullanır. Bu
konnektör 9 pinlidir. 1984 yılında IBM’in bilgisayarı AT’yi takdim
etmesinde 9 pinli D tipi DB-9 konnektörünü kullanmıştır.I BM’in
standartları belirlemede bir üstünlüğü olduğundan dolayı o
zamanlarda bazı üretici firmalar tarafından 9 pinli konnektörler
desteklenmiştir.
Ad
Asıl amaç
Kısaltma
Data Terminal Ready
DTE'den DCE'ye olduğunu ifade eder.
DTR
Data Carrier Detect
DCE, telefon hattına bağlıdır.
DCD
Data Set Ready
DCE, komut veya veri almaya hazır.
DSR
Ring Indicator
DCE, telefon hattına zil çalma sinyali geldiği algılandı.
RI
Request To Send
DTE, DCE'nin veri alımına hazır olduğu isteği.
RTS
Clear To Send
DCE'nin veri alımını kabul ettiğini ifade eder.
CTS
Transmitted Data
DTE'den DCE veri taşır.
TxD
Received Data
DCE'den DTE'ye veri taşır.
RxD
Common Ground
GND
Protective Ground
PG
DTE : Data Terminal Equipment : veri terminal ekipmanı
DCE : Data Communication Equipment : veri taşıma ekipmanı
RS-232 standardı ile iletim seri bir şekilde ve asenkron olarak yapılır. Örnek olarak
bir bilgisayarla diğer bir bilgisayarın modemle bağlantısını düşünelim.
Bir RS-232 standardı ile çalışırken ve iletişimi sağlanan birim DTE (Data Terminal
Equipment) ve iletişimi sağlayan birim DCE (Data Communication Equipment) olarak
adlandırılır. DCE en genel şekilde modem’dir. Modemler, telefon hatları üzerinden
haberleşirler. Normalde bilgisayar içindeki haberleşme paralel bir şekilde
yapılmaktadır. Karşımıza şöyle bir sorun çıkmaktadır. Bu da bilgisayarın dışına
yapılacak olan veri akışının seri bir şekilde olmasıdır. Dolayısıyla bilgisayardaki
datayı dışarıya göndermek için bunu seri bir forma dönüştürmemiz gerekir.
Bu işlem UARTS olarak adlandırılan arabirim devreleri (IC) ile yapılmaktadır. Bu
devrelerin birçok çeşidi bulunmaktadır. Aynı zamanda bu devreler bilgisayar içinde
kullanılan sinyal seviyeleri olan TTL (+5V ve 0V)’yi RS-232 Sinyal seviyeleri olan
+12V, -12V ‘a dönüştürürler. Daha sonra gönderilecek veriler, RS-232 portundan
dışarıya bir RS-232 tablo ile ulaşılması istenen DCE birimine gönderilir
RS-232 sürücü
Seri porttan alınan veri TTL devrede kullanılacaksa verinin gerilim seviyesinin o devrenin
standardına uydurulması gerekmektedir. Bu işlem MAX232 gibi entegreler vasıtasıyla
yapılmaktadır.
SİNYAL KODLAMASI
RS-232 C hatları TTL sinyal seviyelerini (+5V, OV) taşımaz. Tipik olarak gerilim seviyeleri
+12 V ve -12V’dur. Fakat RS-232 hatları, +25VDc’ye kadar yüksek olan sinyal seviyeleri ile 25 V Dc’ye kadar düşük olan sinyalleri taşıyabilir. Negatif gerilimler lojik “1”i pozitif
gerilimler lojik “0”’ı temsil etmektedir. Bilindiği üzere bilgisayardaki data iletimi ikilik
sistemde olmaktadır. Lojik 1’e +5V karşılık gelirken, lojik 0’a OV seviyesi denk gelir. Bu tür
bir çevrime TTL (Transistor, Transistor Lojik Level) çevrimi denir. Bu, bilgisayar içindeki
haberleşme standardı kabul edilir. Bilgisayar içindeki data transferlerinde TTL seviyeli
sinyallerin kullanılması birkaç sebepten dolayı avantajlıdır.
• Güç Yönünden
• Isı dağılımının az olmasından
• TTL aletler yüksek hızda çalışabilir. Bu durum bilgisayar içindeki data transferleri için çok
uygundur.
Peki Neden Bu TTL RS-232C için Kullanılmamıştır? Çünkü TTL haberleşmesinde birkaç
karış mesafeden sonra sonra çok ciddi problemler ortaya çıkmaktadır. Ayrıca TTL,
dışarıdan gelen sinyallerden çok çabuk etkilenir. Dolayısıyla sinyaldeki birkaç Voltluk kayıp
sinyalin belirsiz bölgeye düşmesine sebep olur.
RS-232 hatları gürültülü hatlar üzerinde yüzlerce karış mesafede sinyalleri
göndermek zorunda kalabilmektedir. +5V, uzak mesafelere göndermede bir
zayıflamaya maruz kalacaktır.
Başarılı bir iletimin sağlanabilmesi için RS-232 sinyalleri pozitif bir sinyal için +5V
ile +15 V arasında ve negatif bir sinyal içinde -5V ile-15V arasında bir değer
almalıdır. Bu aralığı bu şekilde tutarak, gürültüden dolayı oluşan gerilim
dalgalanmalarından etkilenmesini de minimuma indirmiş oluruz. Bu şekilde bir
sinyal transmitter’dan gönderildi diyelim. RS-232 receiver’ı için ise bu sinyal
aralığı +3V’dan yukarısı için pozitif sinyal, -3V ve bundan aşağı için ise negatif
sinyal olduğu anlaşılır. Peki -3V ile +3V arasındaki bölgede ne olacak? Bu bölge
kararsız bir bölgedir. Bu bölgede bulunan bir sinyal, gürültü olarak kabul edilir.
RS-232 hatları pozitif olarak +25 V’a kadar, negatif olarak da -25V’a kadar olan
sinyalleri taşıyabilir.
Seri Data Formatı
Seri data formatı bir start biti, 5 ve 8 bit arasında data biti ve bir stop biti içerir.
Formata gerektiğinde bir parity biti ve bir stop biti daha eklenebilmektedir. Seri
iletişimde veriler byte olarak iletilir. Aşağıda verilen yapıda 12 bit vardır. Burada
hata var gibi gözükebilir ama bilgisayarda saklanan kısım data bitleridir. Diğer startstop bitleri ve parity bitleri kaydedilmez.
A=65D, 41H, 0100 0001B
Senkron İletişim: (Eşzamanlı) İki cihazın da saat
çevrimi aynıdır. Bu iletim şeklinde başla ve dur
bitleri gönderilmez.
Asenkron iletişim: (Eşzamansız) İletişimdeki
cihazların saat çevrimi farklıdır. Bu iletim şeklinde
başla ve dur bitleri gönderilmelidir.
Bitler nasıl iletilir?
Seri iletişimde belli bir sürede bir bit iletilir. Bitlerin iletim sırası aşağıdaki
gibidir:
1.
2.
3.
4.
0 değerindeki start biti
Data bitleri ilk data biti iletilecek verinin LSB son data biti MSB bitidir.
Tanımlanmışsa parity (eşlik) biti
1 değerindeki bir tane ya da 2 tane stop biti
Saniyede iletilen bit sayısı baud rate olarak tanımlanmaktadır. Burada
transfer edilen bitler start biti, data bitleri, parity biti ve stop bitleri de hız
hesabına dahil edilmektedir.
Start ve Stop Bitleri (Başla ve Dur bitleri)
Senkron ve asenkron iletişimin tanımından da anlaşıldığı
üzere bir çok seri port asenkron olarak iletişim sağlayabilir.
Start biti iletilecek verinin başladığını, stop biti verinin
iletildiğini ifade etmektedir. Bu bitlerin tanımlanması
aşağıdaki gibi olmaktadır:
Seri port pini boşta iken (veri iletmiyorken) “on”
durumundadır. Veri iletileceği zaman “off” konumuna getirilir.
(Bu start bitidir). Stop bitine bakılarak veri iletimi bittiğinde
seri port pini tekrar “on” konumuna getirilir.
Data Bitleri
Seri porttan iletilen veri cihaz komutu ya da sensörden okunan veri, hata mesajları vb.
olabilir. İletilen veri binary ya da ASCII olabilir.
Çoğu seri port 5-8 bit veri iletir. Binary veri tipik olarak byte şeklinde (8bit) iletilir. Eğer veri
ASCII formatta iletiliyorsa minimum 7 bit gereklidir çünkü 27 yada 128 farklı karakter
mevcuttur. Eğer 8. bit kullanılıyorsa 0 yapılmalıdır. Eğer data genişletilmiş ASCII karakter seti
içeriyorsa 8 bit kullanılır çünkü bu aralıkta 28 ya da 256 farklı karakter vardır.
Parity biti
Parity biti iletilen veri için basit hata kontrolü sağlar. Parity bit değerleri aşağıdaki gibi
ayarlanabilmektedir:
Even: Data bitleri ve parity biti içindeki 1’lerin sayısı çifttir.
Odd: Data bitleri ve parity biti içindeki 1’lerin sayısı tektir.
Mark: Parity biti her zaman 1’dir
Space: Parity biti her zaman 0’dır.
Mark ve space parity kontrolleri çok nadir kullanılmaktadır çünkü minimum
düzeyde hata kontrolü sağlarlar. Parity kontrolü aşağıdaki aşamalardan
oluşmaktadır:
1. Veri ileten cihaz parity biti 0 ya da 1 olarak ayarlanır.
2. Alıcı cihaz parity bit ile alınan verinin tutarlı olup olmadığına bakar. Tutarlı ise
bitler kabul edilir değil ise geri hata döndürülür.
Örneğin 01110001 data bitleri bilgisayarınıza geldi. Eğer even parity bit seçili ise
cihaz tarafından parity bit 0 yapılır çünkü 1’lerin sayısı çifttir. Eğer odd parity seçili
ise parity bit 1 olarak ayarlanır. Bu şekilde iletilen 1’lerin sayısı tek olur.
Not: Parity kontrol biti ile sadece 1 bitlik hatalar anlaşılır.
hatalarında veri geçerli gibi görünebilir.
Çoklu bit
J:74D,4AH, 0100 1010B
RS232C’NİN ELEKTRİKSEL DALGALANMALARA KARŞI KORUNMASI
RS232C seri portları, yüksek voltajdan kolaylıkla zarar görebilir. Bilgisayarın
seri portlarına gelen bir zararın sonucu çok pahalı olabilir. Genellikle, zarar
gören bir seri port için tüm ana kartın değiştirilmesi gerekir. Bu yüzden de, bu
portların yüksek voltaja karşı korunması gereklidir.
RS232C seri portunu yüksek voltajdan korumak aslında oldukça kolaydır.
Standartlara göre sinyal +25V ile -25V arasında olmalıdır. Bu yüzden, bunun
dışındaki voltajlara izin verilmemelidir. Tipik bir RS232C alıcısı +30V ile -30V ‘a
kadar dayanabilir. Bu amaçla kullanılan voltaj koruma devresi, +25V ile -25V
arası dışındaki tüm voltajları keser. Voltaj koruma devresinde;
• Varistörler(Varit Resistor):Bu elemanın direnci, gerilime bağlı olarak değişir.
• zener diyotlar kullanılmaktadır.
İLETİM MESAFESİ
RS-232 standardı azami kablo uzunluğunu
tanımlamaz. Fakat maksimum yük kapasitesi sürücü
devresi
uyumluluğunu
tolere
etmelidir.
Uygulamalar, 15m'den daha uzun kabloların çok
büyük kapasitansa sahip olduğunu göstermiştir.
Düşük kapasitanslı kablolar kullanılarak tam hız
iletişimi,
yaklaşık
300m
mesafeye
kadar
sağlanabilmektedir. Uzun mesafelerde yüksek hız
elde etmek için RS-485 gibi diğer standartlar daha
uygundur.
Kaynaklar
• http://320volt.com/rs232-seri-iletisim-portuhakkinda-bilgiler/
USB-RS-232 dönüştürücüler
http://www.codeproject.com/Articles/75770/Basic-serial-port-listening-application
Sistemdeki seri portları listeleme
public SerialPortManager() { // Finding installed serial ports on hardware _currentSerialSettings.PortNameCollection =
System.IO.Ports.SerialPort.GetPortNames(); _currentSerialSettings.PropertyChanged += new
System.ComponentModel.PropertyChangedEventHandler (_currentSerialSettings_PropertyChanged); // If serial ports is found, we select the
first found if (_currentSerialSettings.PortNameCollection.Length > 0) _currentSerialSettings.PortName =
_currentSerialSettings.PortNameCollection[0]; }
Baud rate güncelleme
private void UpdateBaudRateCollection() { _serialPort = new SerialPort(_currentSerialSettings.PortName); _serialPort.Open(); // Getting
COMMPROP structure, and its property dwSettableBaud. object p = _serialPort.BaseStream.GetType().GetField("commProp",
BindingFlags.Instance | BindingFlags.NonPublic).GetValue(_serialPort.BaseStream); Int32 dwSettableBaud =
(Int32)p.GetType().GetField("dwSettableBaud", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).GetValue(p);
_serialPort.Close(); _currentSerialSettings.UpdateBaudRateCollection(dwSettableBaud); }
Seri port ayarlama ve seri portu dinleme
public void StartListening() { // Closing serial port if it is open if (_serialPort != null && _serialPort.IsOpen)
_serialPort.Close(); // Setting serial port settings
_serialPort = new SerialPort( _currentSerialSettings.PortName,
_currentSerialSettings.BaudRate,
_currentSerialSettings.Parity,
_currentSerialSettings.DataBits,
_currentSerialSettings.StopBits); // Subscribe to event and open serial port for data
_serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived); _serialPort.Open(); }
Veri okuma
void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int dataLength = _serialPort.BytesToRead;
byte[] data = new byte[dataLength];
int nbrDataRead = _serialPort.Read(data, 0, dataLength);
if (nbrDataRead == 0)
return; // Send data to whom ever interested
if (NewSerialDataRecieved != null)
NewSerialDataRecieved(this, new SerialDataEventArgs(data));
}
Seri porta veri gönderme
_serialPort.Send(this.SendText.Text);
Portu kapatma
/// Closes the serial port public void StopListening()
{
_serialPort.Close();
}
Download