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...
 
Her zaman 115200 baud kullanirim, hic problem yasamadim. Dikkat edilecek fazla birsey yok. Sadece mesafe coksa baud rate dusurulecek.
 
seri portta en sinir olduğum şey çapraz ve düz kablo diye ayrım olması. Onun haricinde basit ve kullanışlı.
 
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 :)
 
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:
 
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.
 
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...
 
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.
 
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.
 
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
127,952
Mesajlar
913,873
Kullanıcılar
449,599
Son üye
Gksn

Yeni konular

Geri
Üst