RS 232 3 byte veri alma sorunu

Başlatan ofdan, 26 Ekim 2010, 21:43:13

izwirlee_35

teşekkürler klein ayrıca tek tek açıklamanda çok daha ii oldu böylece diger baud rateler için kendi bekleme zamanımın hesabını kendim yapıcam saolasın.
peki bir sorum daha olacak biz dedigin gibi 10 bit gönderiyoruz bnm sorum 8 bitlik data olan kısım için şimdi diyelim ki ben
dizi1[5]={1234};(her dizinin sonunda null oldugu için 5 dedim )
ben bunu gönderirken null karakteride gidiyor ya, ben gelen bilgi için

if(RCIF)
         {
         rx[rx_adr]=RCREG;   
         
         if(rx[rx_adr]=='\0')rx_adr=0;
         else rx_adr++;

         
         RCIF=0;
         }
şeklinde yapsam çalışması dogru olurmu ?


keep learning . . .

Tagli

RCIF = 0; demene gerek yok. RCREG'i okuduğunda otomatik olarak RCIF 0 olur zaten, tabi eğer iki katlı olan bu register'da bekleyen başka bir veri yoksa.

Diğer başlıkta verdiğim kodlardaki amaç programı sadeleştirmekti. Bu şekilde sorunun kaynağını bulmanın daha kolay olacağına inanıyorum. Yoksa senin kodunda gözüme çarpan bir hata yok. Şüpheye sebep olan birkaç nokta içinse kesin konuşamam, çünkü hem PIC C bilmiyorum (gerçi assembly'ye yakın bir C ile yazmışsın, o yüzden büyük oranda anladım), hem de programı yazmayan biri onu yazar kadar rahat anlayamaz.
Gökçe Tağlıoğlu

izwirlee_35

dediğinizi yaptım sayın tagli ve şunu farketdim verileri saglıklı şekilde alıyorum bunu mplabın watch ekranından da registerlara tek tek bakarak anladım bnm hatalı oldugum nokta ise aldıgım veriyi karşılaştırma işi yani gelen  bilgiyi dogrumu diye karşılaştırmak çok basit görünüyo aslında ama bi türlü yapamadım.

void cmp()
{
   m=0;
   kars_sonuc=0;
   z=0;
   while(!pkt_tmm);
   do
   {
   CLRWDT();
      kars_sonuc=rx[m] - *kars_1;
      if(kars_sonuc<0){z=0;}
      else if(kars_sonuc>0){z=0;}
      else if(kars_sonuc==0){z=1;}
   m++;
   *kars_1++;
   }
   while(*kars_1);

return z;
}


fonksiyonum bu .
keep learning . . .

justice_for_all

arkadasim peki direct olarak karsilastirma yapan komutlar var onu nie kullanmiyosun gerci hi-tech de varmi bilmiyorum ccs ve C18 de var ama bi arastirirmisin..

derleyicinin klasorunde string.h dosyasinda olmasi gerek..


Kolay Gelsin..

garslanbay@yahoo.com
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Klein

koddan anladığım kadarıyla  gelen veriyi karşılaştıracağınız bir dizi var. yani gelmesi beklenen  veri (1,2,3,4) ise sizin de içeriğinde (1,2,3,4) olan bir diziniz var. ve bu diziye işaret eden bir kars_1 pointeriniz var.
eğer bu çıkarım doğru ise:
hatanız şu ; kars_1++ ile  pointerini artırmak yerine *kars_1++ ile pointerin içeriğini artırıyorsunuz. Bu durum 1,2,3,4 gibiardışık veride bir hataya neden olmasa bile başka bir veride hataya neden olabilir.

Ayrıca gelen verinin doğruluğunun kontrolü için bu yöntem pek uygun değil. Bu kontrolü yapmanın en iyi yolu CRC kullanmaktır.
CRC hesaplaması biraz karmaşık bir işlem ama , CRC tablosu kullanarak işi kolaylaştırabilirsin. 

bekleme yerine 0x00 sayısı bekleyerek de sonlandırma yapabilirsin. Ancak başlangıç ve sonlandırma karakteri kullanılan aktarımların ASCII yapılması gerekir. Çünkü sizin sonlandırma karakteriniz yani burada 0 , karşı taraftan elen bir sayı da olabilir. Bu durumda sıkıntılar yaşaybilirsiniz.
Eğer sayıları 0,1,2,3,4 şeklinde doğrudan göndermek yerine '0','1','2' gibi ASCII karakterler gönderir iseniz sıfır sonlu dizi kullanmanız sorun teşkil etmez.

Benim önerim ise:
Sayıları ASCII olarak değil doğrudan sayı olarak gönderip , kontrol için de CRC kullanmanız olur. Böylece hem ASCII haberleşmeye göre daha hızlı , CRC sayesinde daha güvenli aktarım yapabilirsiniz.

justice_for_all

Klein arkadasimla ayni fikirdeyim siz pointerin degerini degilde pointerin gosterdigi adresteki veriyi arttiriyorsunuz arkadasim....

ayrica derleyiciniz Hi-tech dimi..CCS de gorunce sasirdim bi an...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

muhittin_kaplan

....
hepsi iptal
-----------------------------------------------------------------
epey bir yeri okumadan cevap vermişim

izwirlee_35

klein arkadaşım önerilerin için teşekkürler hemen deniycem sonuçları tekrar paylaşıcam.CRC kodlamayı da araştırmaya başlıycam.
forum da baya bi araştırdım benim kullandığım derleyici hitech fakat benim hatam mantık hatası oldugu için bu sorunu yasayan ccs kullannan ve bunu ccs baslıgı altında  paylaşan arkadaşın konu başlıgı altında görünce bende mantık hatamı düzeltmek için buraya yazdım.teşekkürler.
CRC kodlamayı da araştırmaya başlıycam
keep learning . . .