Seri Port (RS232) Haberleşmesi Tecrübeleriniz?

ULAGA

Üye
Katılım
9 Ocak 2012
Mesajlar
589
Puanları
1
Arkadaşlar bu konuda, herkesten bir isteğim var.
RS232 ile çalışmış arkadaşlar, tecrübelerini anlaşılır bir dil ile açıklarlarsa çok bahtiyar olurum.
Belli bir sabit sorum yok, sadece elektronik hayatınızdaki bu konu ile tecrübelerinizi duymak istiyorum.
Başınıza gelen aksilikler, aldığınız önlemler, baudrate hakkındaki tecrübeleriniz ve her türlü önerileriniz...

Tecrübelerini paylaşacak arkadaşlara, şimdiden müteşekkirim...
 

silvestir

Profesyonel Üye
Katılım
10 Ağu 2011
Mesajlar
2,769
Puanları
656
Her zaman 115200 baud kullanirim, hic problem yasamadim. Dikkat edilecek fazla birsey yok. Sadece mesafe coksa baud rate dusurulecek.
 
Katılım
24 Mar 2007
Mesajlar
58
Puanları
1
seri portta en sinir olduğum şey çapraz ve düz kablo diye ayrım olması. Onun haricinde basit ve kullanışlı.
 

MAIN_LOOP

Onursal Üye
Onursal Üye
Katılım
28 Ara 2011
Mesajlar
2,184
Puanları
935
Yaş
42
Konum
ANKARA
Her zaman 115200 baud kullanirim, hic problem yasamadim. Dikkat edilecek fazla birsey yok. Sadece mesafe coksa baud rate dusurulecek.

muhtemelen pic kullanıyorsunuz

osc ye göre baud hesapları:

40mhz de 115200bps
brgh=1 iken hesaplanan bps:113.636 hata: % -1.357
brgh=0 iken hesaplanan bps:125.000 hata: % 8.507

daha aşğıdaki osc leri yazmama gerek yok heralde.

hiçmi sorun yaşamıyorsunuz? ne gönderiyorunuz sadece "A" karakterimi :)
 
Konu Sah
ULAGA

ULAGA

Üye
Katılım
9 Ocak 2012
Mesajlar
589
Puanları
1
PIC, PSoC, ... değişiyor... :)
Elbette sorun yaşadığım zamanlar oluyor.
Bir şekilde çözüyorum.
Ancak bilgi ve zaman yaşamdaki en değerli şeylerdir...
İsterim ki, bu konu hakkında bilgi ve tecrübeleri olan arkadaşların, bu bilgi ve tecrübelerini paylaşmasını...
Az önce 1MB'a yakın veri alışı yaptım...
Ancak dediğin gibi sadece A harfini aldığım yerler de oluyor... :eek:
 

MAIN_LOOP

Onursal Üye
Onursal Üye
Katılım
28 Ara 2011
Mesajlar
2,184
Puanları
935
Yaş
42
Konum
ANKARA
yararman ben genelde aşağıdaki formatta iletişim kullanıyorum

9600bps 8n1 10mhz ve 40mhz kristallerinde hata oranı % 0.16

pic içerisinde asla soft uart kullanmıyorum. mutlaka ve mutlaka tx ve rx pinlerini kullanıp interrupt ile kontrol yapıyorum. dışarıdan gelen verinin asla kaçırılmaması gerekli. bir projemde bir cihaz ile bağlantı kurmam gerekmişti fakat cihaz bana herhangi bir zamanda,uzunluğu belli olmayan ve başı sonu belli olmayan bir paket yapısı gönderiyordu. yani senkronizasyon için hiç bir bilgi olmadığı gibi, alacağım dizininde kaç byte uzunluğunda olduğu belli değildi. neyse çözüm olarak bir tmr0 interruptu kullandım. kullanılan baudrate belliydi 9600. bunun için bir bitin hatta kalma süresinden yola çıkarak bir süre tayin ettim. uart interrupt flag 1 olduğu anda recing diye bir bit atamıştım. bunu set edip bundan sonra gelen her uart flag larinde tmr yi clear ediyordum. eğer tmr belli bir değere ulaşırsa (bu süre 2-3 byte süresi kadar) paket alınmış oluyordu. ve yine kendi tanımladığım rcvd biti set oluyordu. böyle bir çözümüm olmuştu bir anlamda uart watchdog gibydi yani.
 
Konu Sah
ULAGA

ULAGA

Üye
Katılım
9 Ocak 2012
Mesajlar
589
Puanları
1
Aşağıda örnek bir kesme var.

Kod:
void interrupt()
{
   if (PIR1.RCIF)
   {
      charRX = Uart1_Read();
      arrayRX[v] = charRX;
      v++;
      PIR1.RCIF = 0;             //
      if (charRX == 36)          // Sonlandırma karakteri olan $ gelmişse
      {
         flagRX = 1;
      }
   }
}

Ne kadar byte geldiğini hesaplamak kolay aslında.
İnterrupt içine long int türünde bir değişken koyarsın.
Karşı cihaz sana bir veri başlangıç karakteri gönderir; atıyorum # diye.
Sen kesme içerisinde, bu başlangıç karakteri geldikten sonra;
Diğer gelen her bir karakterde, tanımladığın long int içeriğini bir artırırsın.
Karşıdaki cihaz göndermek istediği veriyi gönderdikten sonra;
Sonlandırma karakterini gönderir; atıyorum $ diye.
Sonlandırma karakterini de denetledikten sonra;
long int değişkenin içeriği gönderilen verinin byte türünden boyutunu verir...
Tabi bu dediklerim checksum ile yapılırsa daha sağlıklı sonuçlar alınır...
 

MAIN_LOOP

Onursal Üye
Onursal Üye
Katılım
28 Ara 2011
Mesajlar
2,184
Puanları
935
Yaş
42
Konum
ANKARA
Aşağıda örnek bir kesme var.

Kod:
void interrupt()
{
   if (PIR1.RCIF)
   {
      charRX = Uart1_Read();
      arrayRX[v] = charRX;
      v++;
      PIR1.RCIF = 0;             //
      if (charRX == 36)          // Sonlandırma karakteri olan $ gelmişse
      {
         flagRX = 1;
      }
   }
}

Ne kadar byte geldiğini hesaplamak kolay aslında.
İnterrupt içine long int türünde bir değişken koyarsın.
Karşı cihaz sana bir veri başlangıç karakteri gönderir; atıyorum # diye.
Sen kesme içerisinde, bu başlangıç karakteri geldikten sonra;
Diğer gelen her bir karakterde, tanımladığın long int içeriğini bir artırırsın.
Karşıdaki cihaz göndermek istediği veriyi gönderdikten sonra;
Sonlandırma karakterini gönderir; atıyorum $ diye.
Sonlandırma karakterini de denetledikten sonra;
long int değişkenin içeriği gönderilen verinin byte türünden boyutunu verir...
Tabi bu dediklerim checksum ile yapılırsa daha sağlıklı sonuçlar alınır...

bağlantı kurduğum modul cr ve lf ile başlayıp cr ve lf ile bitiriyordu. ve aradaki byte uzunluğu belli değildi. sorun olan byte uzunluğundan ziyade paketin bittiğini algılamaktı bu yüzden tmr0 dan faydalanmıştım.
 

alarmko

Paylaşımcı üye
Katılım
14 Ocak 2009
Mesajlar
888
Puanları
106
Yaş
57
ben bir türlü interrup kullanmaya alısamadım.programlarımı asm de yazdıgım icin 1-2 us lik kayıpla kontrol etmek istedigim datayı kontrol ediyorum.uart lı entegrelerı daha yeni yeni kullanmaya basladım,daha önceleri haberlesme protokolunu kendım yazıyordum.bu deneyım hıcte fena olmadı,uzaktan kumanda eeprom vs haberlesmenınde (seri haberlesme) temelını olusturdu bende.ingilazca ve elektronik mühendisi olmayınca amerikayı herseferinde yeniden kesfediyorum.veri güvenligi icin büyük miktarda data göndermiyeceksem ya yansıma kullanıyorum veyahutta aynı datayı cift gönderiyorum.
yararman 1mb oldukca yuksek miktarda veri,siz hangi hızları ve yontemi kullandınız.
 
Konu Sah
ULAGA

ULAGA

Üye
Katılım
9 Ocak 2012
Mesajlar
589
Puanları
1
bağlantı kurduğum modul cr ve lf ile başlayıp cr ve lf ile bitiriyordu. ve aradaki byte uzunluğu belli değildi. sorun olan byte uzunluğundan ziyade paketin bittiğini algılamaktı bu yüzden tmr0 dan faydalanmıştım.

Yanlış neticelendiriyorsam affola ancak ben; bu paketin bittiğini algılamak için neden zamanlayıcı kullandığını anlayamadım.
Zaten veri paketi bittikten sonra veriyi gönderen cihaz veri sonlandırma bilgisi de gönderecektir.
O veri sonlandırma bilgisini, alıcı cihaz denetledikten sonra denetleme olumlu ise veri paketi bitmiş demektir...

Sorunu yanlış algılamış da olabilirim ancak benim algıladığım haliyle zamanlayıcı kaydedicisine gerek yok...
 

Forum istatistikleri

Konular
122,171
Mesajlar
861,612
Kullanıcılar
438,643
Son üye
register1

Yeni konular

Üst