Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

ic ice if dongusu

Başlatan selvi, 08 Eylül 2014, 13:50:19

selvi

  programda 5 tane ard arda kosul sorgulamasini yapmak istiyorum.gelen bilgi ilk 5 kosuldan birini  sagliyorsa program delay_ms(100) komutunu islesin eger gelen bilgi ilk bes kosuldan herhangi birini saglamiyorsa program :rx_data(); fonksiyona dallansin.case komutuyla olabilecegini dusunuyorum ama ben if komutuyla yapmak istiyorum.asagidaki sekilde  yazilabilir mi?degilse nasil yazilabilir?

              if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x05 ))       
              {
                  LED_RX=LED_RX^1;   
              }
                else if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x12 ))       
                 {
                       LED_RX=LED_RX^1;   
                 }
                      else if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x23 ))      
                      {
                            LED_RX=LED_RX^1;
                      }
                            else if(( chksum == rx_buf[9] )&&( rx_buf[0] == 0x09 ))       
                            {
                                 LED_RX=LED_RX^1;
                            }
                                 else if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x45 ))      
                                 {
                                      LED_RX=LED_RX^1;
                                  }
                   else
                   {
                     rx_data();     // restart Rx when data is not correct.*//
                    }
             delay_ms(100);
code]
Yaşam anlamlandırıldıkça kutsaldır....

Gökhan BEKEN

Öyle olmaz. İlla iç içe olacaksa böyle olmalıdır. Ama iç içe if kullanmak pek hoş görükmüyor.

if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x05 ))       
{
	if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x12 ))       
	{
		if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x23 ))      
		{
			if(( chksum == rx_buf[9] )&&( rx_buf[0] == 0x09 ))       
			{
				if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x45 ))      
				{
                                      LED_RX=LED_RX^1;
				}
			}
	}
}
else
{
	rx_data();     // restart Rx when data is not correct.*//
}

delay_ms(100);



Bu arada bu şartlar hiç bir zaman sağlanamaz ilk iki if birbirine ters çünkü
rx_buf[4] değişkeni aynı anda hem 0x05 hem 0x12  olamaz.
Özel mesaj okumuyorum, lütfen göndermeyin.

selvi

#2
  hocam  vericiden butonlara basildiginda aliciya gelen 5 farkli bilgi.bu bilgiler en iyi nasil duzenlenebilir?ic ice if dongusu kullanmak zorunda değiliz.
   kosullardan once asagidaki gibi bir sorgulama var:
 
for(i=0;i<5;i++)      // cal Checksum
           chksum += rx_buf[i];
 
Yaşam anlamlandırıldıkça kutsaldır....

Gökhan BEKEN

Önce şartın gerçekleşmesi neye bağlı onu tam bilelim.
Gündelik dille anlatın,
mesela:
Alıntı Yap"chksum" değişkeni "rx_buf[4]" değişkenine eşit olduğunda
"rx_buf[0]" değişkeni "0x05" ,"0x12" ,"0x23"  değerlerinden biri olursa
ve aynı zamanda falanca filancaya eşit olursa şart sağlansın
gibi birşey söyleyin

"Alıcıya gelen 5 farklı veri" derken, bu veriler nedir? Hangi veriler gelirse geçerli olacak, bunu yazın.
Bana şu şekilde söyleyin:
Alıntı Yap
butona basınca şu veriler geliyor:
0x23 0xAF 0xE7 0x87 0x42
Özel mesaj okumuyorum, lütfen göndermeyin.

hasankara

if(chksum == rx_buf[4] ){ // chksum uyusur ise
   if( (rx_buf[0] == 0x05) || (rx_buf[0] == 0x12) || (rx_buf[0] == 0x23) || (rx_buf[0] == 0x09) || (rx_buf[0] == 0x45))
   {// dizinin ilk hucresi istenen degerlerden biri ise
   LED_RX=LED_RX^1;
   delay_ms(100);
   } else { // dizinin ilk hucresi istenen degerlerden biri degil ise
   
   }
} else {// chksum uyusmaz ise
rx_data(); 
}

Karamel

hasan hocam aralarda veya degilde ve olmasi gerekmezmi? && ?

Kabil ATICI

yazım doğru . gerçi arada farklı bir veri var ama genel olarak doğru.
Ortak olan chksum, diğerleri genel olarak "veya" işlemi . Kullanıcı kendine göre düzenleyebilir.
ambar7

selvi

  vericide 5 tane buton var.her butona basildiginda 5 paket bilgi gonderiyor.her butonun gonderecegi paket bilgileri farklidir.ornegin 1.buton:{0x12,0x13,0x14,0x15,0x54}
asagidaki kod paket bilgilerin ilk dort bilgisinin toplamini ifade edeiyor.alicilar gelen  kodu kontrol ederken soyle bir sart sorgulamasi yapiyor.
[for(i=0;i<4;i++)      // cal Checksum
           chksum += rx_buf[i];code]

alicilar gelen  kodu kontrol ederken soyle bir sart sorgulamasi yapiyor.yani paket bilgilerden 4 tanesini toplamini chksum degiskenine ataniyor.sonrasinda paketteki 5.bilgi ile paketin ilk dort bilgisi esit mi diye bir sorgulama yapiyor.
[code]chksum == rx_buf[4] /code]

program alicilardan gelen bilgileri sorguluyor ona gore ledi yakiyor.programda 5 tane ard arda kosul sorgulamasini yapmak istiyorum.gelen bilgi ilk 5 kosuldan birini  sagliyorsa program delay_ms(100) komutunu islesin eger gelen bilgi ilk bes kosuldan herhangi birini saglamiyorsa program :rx_data(); fonksiyona dallansin.asagidaki sekilde duzenledim.bu yonlu farkli cevaplarda geldi.bahsettigimi tam karsilamiyor.
[code]
Kod: [Seç]
              if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x05 ))       
              {
                  LED_RX=LED_RX^1;   
              }
                else if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x12 ))       
                 {
                       LED_RX=LED_RX^1;   
                 }
                      else if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x23 ))      
                      {
                            LED_RX=LED_RX^1;
                      }
                            else if(( chksum == rx_buf[9] )&&( rx_buf[0] == 0x09 ))       
                            {
                                 LED_RX=LED_RX^1;
                            }
                                 else if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x45 ))      
                                 {
                                      LED_RX=LED_RX^1;
                                  }
                   else
                   {
                     rx_data();     // restart Rx when data is not correct.*//
                    }
             delay_ms(100);/code]
Yaşam anlamlandırıldıkça kutsaldır....

Kabil ATICI

#8
else if(( chksum == rx_buf[9] )&&( rx_buf[0] == 0x09 ))   //bu satır doğrumu 5 tane veriden bahsediliyor

chksum == rx_buf[9] --->> ?
eğer bu satırda chksum == rx_buf[4]  ise !!!

if(chksum == rx_buf[4] )
{ // chksum uyusur ise
   if( (rx_buf[0] == 0x05) || (rx_buf[0] == 0x12) || (rx_buf[0] == 0x23) || (rx_buf[0] == 0x09) || (rx_buf[0] == 0x45))
{
delay_ms(100)
}
else
{
rx_data();
}
}

aslında olay VE ve VEYA işlemlerinin dağılma özelliği...
ambar7

selvi

#9
Alıntı yapılan: ambar7 - 09 Eylül 2014, 10:25:42
else if(( chksum == rx_buf[9] )&&( rx_buf[0] == 0x09 ))   //bu satır doğrumu 5 tane veriden bahsediliyor

chksum == rx_buf[9] --->> ?
eğer bu satırda chksum == rx_buf[4]  ise !!!

if(chksum == rx_buf[4] )
{ // chksum uyusur ise
   if( (rx_buf[0] == 0x05) || (rx_buf[0] == 0x12) || (rx_buf[0] == 0x23) || (rx_buf[0] == 0x09) || (rx_buf[0] == 0x45))
{
delay_ms(100)
}
else
{
rx_data();
}
}

aslında olay VE ve VEYA işlemlerinin dağılma özelliği...

eger kosul saglanmiyorsa da rx_data(); fonksiyona gitmeli.
if(chksum == rx_buf[4] )/code]

asagidaki sekilde olmaz mi?
[code]if(chksum == rx_buf[4] ){ // chksum uyusur ise
   if( (rx_buf[0] == 0x05) || (rx_buf[0] == 0x12) || (rx_buf[0] == 0x23) || (rx_buf[0] == 0x09) || (rx_buf[0] == 0x45))
   {// dizinin ilk hucresi istenen degerlerden biri ise
   LED_RX=LED_RX^1;
   } else { // dizinin ilk hucresi istenen degerlerden biri değil ise
   rx_data();
   }
} else {// chksum uyusmaz ise
rx_data(); 
}
delay_ms(100);
/code]
Yaşam anlamlandırıldıkça kutsaldır....