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...
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...
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.
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...
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...