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]
Ö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.
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];
Ö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
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();
}
hasan hocam aralarda veya degilde ve olmasi gerekmezmi? && ?
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.
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]
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...
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]