rs232 şarta bağlı işlem yapma-- CCS C

Başlatan ziyaretci, 07 Eylül 2012, 23:22:25

ziyaretci

 Merhaba,

Rs232 üzerine çalışıyorum.

Klavyeden bilgi geldiğinde, gelen bilgiyi string olarak bir değişkene aktarıyorum ve lcd de gösteriyorum.

Yapmak istediğim şey  bir şarta bağlı olarak klavyeden istenilen komut girildiğinde işlem yapma.


Mesela veri_kayit değişkeni basla değişkeninin içeriğine eşit ise şu olsun..
if(veri_kayit==dur){output_low(pin_a0);  }
if(veri_kayit==basla){output_high(pin_a0);  }

Yukarıdaki deyimleri klavyeden  girilen bilgiyi lcd de gösterdikten sonraki satıra yerleştirdim , hatta mantık yürüterek bazı komutlardan sonrada yerleştirme yaptım fakat olmadı.
  Bunu nasıl sağlarım.

Aşağıda üzerinde çalıştığım rs232 kodları var.


#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4M)


 #define LCD_DATA_PORT      getenv("SFR:PORTB")
 #include <lcd.c>
  
   #use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, parity=N, stop=1)


 char* basla="YAK";  //string olarak basla değişkenine "YAK" ifadesini eşitledim.
 char* dur="KAPAT";  // burayada dur değişkenine  "KAPAT" ifadesini eşitledim.
    char veri_kayit[80];
   
     
     #int_rda
      
       
        Void serihaberlesme_kesmesi()
         {
          disable_interrupts(int_rda);
          output_high(pin_c5);
          gets(veri_kayit);
          printf("\n\rGirdiginiz emir-> %s\n",veri_kayit);
          printf(lcd_putc,"\f%s",veri_kayit);
          if(veri_kayit==dur){output_low(pin_a0);  }
          if(veri_kayit==basla){output_high(pin_a0);  }
          output_low(pin_c5);
          
          printf("\n\rSAYIN CAVUS EMiR VE KOMUTLARINIZA HAZiRiM ->");
         }
         
         Void main()
         {
         setup_psp(PSP_DISABLED);   // psp kapatıldı.
       setup_timer_1(T1_DISABLED); //t1 kapatıldı.
       setup_timer_2(T2_DISABLED,0,1);  // t2 kapatıldı.
       setup_adc_ports(NO_ANALOGS);  // analog grişler kapatıldı.
       setup_adc(ADC_OFF);    // adc kapatıldı.
       setup_CCP1(CCP_OFF);   // ccp1 kapatıldı.
       setup_CCP2(CCP_OFF);   // ccp2 kapatıldı.
       
        output_low(pin_c5);
        lcd_init();
        printf("\r**SAYIN YONETICI**Merhaba*****");
        printf("\n\rKlavyeden girdiginiz bilgiler lcdde gozukecektir\n\n");
        printf("\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>");
        enable_interrupts(GLOBAL);  
        
        while(1)
        {
         enable_interrupts(int_rda);
           
        }
         }
         
         



 

matador

void  RDA_isr(void) 
{
   char kod[10];
   int veri;
   char gps[60];
   int art;
   
   disable_interrupts(GLOBAL);
   disable_interrupts(INT_RDA);
   for(veri=0;veri<7;veri++)
   {
      kod[veri]=getchar();
      putchar(kod[veri]);
      output_d(0xff);
   }
   if(kod[0]=='$'&&kod[1]=='G'&&kod[2]=='P'&&kod[3]=='R'&&kod[4]=='M'&&kod[5]=='C'&&kod[6]==',')
      {
         printf("\n\r");
         for(art=0;art<60;art++)
         {
            gps[art]=getchar();
            putchar(gps[art]);
         }
         break;
      }
   return;
}


Hocam bak bu işini görür kontrol edeceğin komut kaç karakterse kesme geldiği ilk anda for döngüsünü ona göre ayarla sonra for döngüsünde aldığın karakterleri tek tek if ile kontrol et sonra if şartının altına yaptırmak istediklerini yaz.

kantirici

kalvyeden gelen string ifadeyi nasıl alıyorsunuz?string sonuna enter ekliyormusunuz?gets komutu string sonunda enter yoksa pici kilitliyor.sizin kodlarda da öyle görünüyor.Ben eklemeden almaya beceremedim de.

ziyaretci

Alıntı yapılan: matador - 07 Eylül 2012, 23:27:37
void  RDA_isr(void) 
{
   char kod[10];
   int veri;
   char gps[60];
   int art;
   
   disable_interrupts(GLOBAL);
   disable_interrupts(INT_RDA);
   for(veri=0;veri<7;veri++)
   {
      kod[veri]=getchar();
      putchar(kod[veri]);
      output_d(0xff);
   }
   if(kod[0]=='$'&&kod[1]=='G'&&kod[2]=='P'&&kod[3]=='R'&&kod[4]=='M'&&kod[5]=='C'&&kod[6]==',')
      {
         printf("\n\r");
         for(art=0;art<60;art++)
         {
            gps[art]=getchar();
            putchar(gps[art]);
         }
         break;
      }
   return;
}


Hocam bak bu işini görür kontrol edeceğin komut kaç karakterse kesme geldiği ilk anda for döngüsünü ona göre ayarla sonra for döngüsünde aldığın karakterleri tek tek if ile kontrol et sonra if şartının altına yaptırmak istediklerini yaz.

şu olayı anlayamadım biraz açarmısınız.

for(veri=0;veri<7;veri++)
   {
      kod[veri]=getchar();
      putchar(kod[veri]);
      output_d(0xff);
   }



Alıntı yapılan: kantirici - 07 Eylül 2012, 23:51:35
kalvyeden gelen string ifadeyi nasıl alıyorsunuz?string sonuna enter ekliyormusunuz?gets komutu string sonunda enter yoksa pici kilitliyor.sizin kodlarda da öyle görünüyor.Ben eklemeden almaya beceremedim de.

    String olarak alıyorum. Enter'a  basınca lcd de gösteriyor.

matador

kod 7 elemanlı dizi veri de integer tipi değişken. for döngüsünde veriyi 6 ya kadar arttırıyoruz her adımda kod dizisine gelen bir bytelık veri yazılıyor yani durum şu
veri=0 iken gelen karakter kod'un 0. elemanına,
.....
....
...
...
veri=6 olduğunda kod'un 6. elemanına gelen karakter yazılmış oluyor sonra for döngüsü biter bitmez kod dizisinin 7 elemanını kontrol ediyoruz istediğimiz karakterler gelmiş ise o karakterlere ait görev yapılıyor.

ziyaretci

Alıntı yapılan: matador - 08 Eylül 2012, 00:07:33
kod 7 elemanlı dizi veri de integer tipi değişken. for döngüsünde veriyi 6 ya kadar arttırıyoruz her adımda kod dizisine gelen bir bytelık veri yazılıyor yani durum şu
veri=0 iken gelen karakter kod'un 0. elemanına,
.....
....
...
...
veri=6 olduğunda kod'un 6. elemanına gelen karakter yazılmış oluyor sonra for döngüsü biter bitmez kod dizisinin 7 elemanını kontrol ediyoruz istediğimiz karakterler gelmiş ise o karakterlere ait görev yapılıyor.


Fakat for döngüsü kesmeye girer girmez işleve başlayacak yani biz klavyeden 1 harf yazdığımızda direkt for döngüsünde olacak 1 harf için 7 defa tarama yapıcak diğer 2. harfi girdiğimizde veri=0  olunca kodun 0. elemanının yerini alıyor  yani ilk girdiğimiz verinin adresi boşa gidiyor .benim anladığım yada anlamadığım nokta diyelim.

matador

Bu bir örnekti şöyle bir şey yapılabilir. Komutlar için karakter sayısı belirleyin örneğin 5. Bir değişken oluşturup her karakter alımında bu değişkeni bir arttırın ve 5 olup olmadığını kontrol edin bu değişken 5 olduktan sonra komutları kontrol edin.

ziyaretci

Alıntı yapılan: matador - 08 Eylül 2012, 00:23:33
Bu bir örnekti şöyle bir şey yapılabilir. Komutlar için karakter sayısı belirleyin örneğin 5. Bir değişken oluşturup her karakter alımında bu değişkeni bir arttırın ve 5 olup olmadığını kontrol edin bu değişken 5 olduktan sonra komutları kontrol edin.

  direk olarak enter'a basıldıktan sonraki girilen karaktere göre işlem yapamaz mıyız daha kolay olurdu .Yoksa dediğiniz gibi yukarıdaki artırma olayı ile yapılabilir.


matador

ENTER tuşuna basılınca da bir değer gelmiyor mu? o değer asci kodlarında vardır. her enter kodu gelince değşikeni arttırın. denemek lazım yapılabilir mutlaka.

ziyaretci

#9
Alıntı yapılan: matador - 08 Eylül 2012, 00:40:21
ENTER tuşuna basılınca da bir değer gelmiyor mu? o değer asci kodlarında vardır. her enter kodu gelince değşikeni arttırın. denemek lazım yapılabilir mutlaka.


şu şekilde olması gerekmez mi?

char* a="abc";
char veri_kayit[80];

gets(veri_kayit);

enter tuşuna basılıncaya denk yazılan string ifade ile geri dönüyor gets komutu.Enter tuşuna bastık yazdığımız stringler veri_kayit a yüklendi. Yani burada yapmamız gereken if(veri_kayit==a) { komutlar;  } sadece bu olması gerekmiyor mu ama olmuyor.

   

mesaj birleştirme:: 08 Eylül 2012, 02:05:26

açıkçası

klavyeden gelen string ifadeyi kaydedip ona göre işlem yapma

örnek:

char gelen;

  if(gelen==abc){komut;}  misal..

mesaj birleştirme:: 08 Eylül 2012, 02:07:22

klavyeden abc girip enter a bastığımızda şart doğru olacağından komut bloğu işlenecek. Ama nasıl?_

matador

bir diziye gelenleri alacakın önce bu dizinin adını buffer yapalım ve local değişken olsun başka bir dizi daha tanımlayıp bunu da işleme sokacağımız olarak ayarlayalım ve global olsun. ilk önce buffer dizisine verileri alıp sonra enter a basılıp basılmadığını kontrol et basılmış ise ayrı bir diziye atıp işlemleri onun üzerinden yap.

ziyaretci

Alıntı yapılan: matador - 08 Eylül 2012, 20:14:43
bir diziye gelenleri alacakın önce bu dizinin adını buffer yapalım ve local değişken olsun başka bir dizi daha tanımlayıp bunu da işleme sokacağımız olarak ayarlayalım ve global olsun. ilk önce buffer dizisine verileri alıp sonra enter a basılıp basılmadığını kontrol et basılmış ise ayrı bir diziye atıp işlemleri onun üzerinden yap.

  Mantıkta sorun yok. Local ve global değişkenden kastınız ?