veri paketlemek "sprintf"?

Başlatan fm, 07 Mayıs 2013, 01:25:55

fm

Merhaba, sormak istediğim birşey var ve benim içn oldukça önemli. Eğer bu konuyu bilen birileri cevap verebilirse çok minnettar kalıcam.

Kurduğum sistem 3 Slave PIC ve 1 Master PICten oluşuyor. Slave0 ve Slave1 PIC16F877A, Slave2 ise 16F876A ile kuruldu. 3 PIC için adresler 0,1 ve 2. Master PIC önce 0 adresini gönderiyor tüm Slavelere. Adres eşleştirmesi doğru olan 0 numaralı Slave 2 adet ds18b20 ile sıcaklık okuyup okuduğu veriyi Master PIC e tekrar gönderiyor ve Master PIC, LCD ekranında yazıyor aldığı veriyi. Bu işlem bitince Master PIC 1 adres bilgisini gönderip aynı işlerin yapılmasını sağlıyor. Aynı işlemler 2 adres bilgisi içinde tekrarlanıyor.

Master PIC te her Slaveden gelen sıcaklık verilerini alıp LCD de yazdırabiliyorum. Yapmak istediğim bu verilerin tamamını(toplamda 6 adet sıcaklık verisi) bir paket haline getirip bilgisayara göndermek. Normalde tek tek bilgisayara gönderebiliyorum. Ancak paket şeklinde göndermek için ne yapmam gerektiğini bir türlü çözemedim.
Kodları ve tasarımı ekledim ama biraz uzun gelebilir.

Lütfen bu konuda bilginiz varsa yardımınızı esirgemeyin. Günlerdir uğraşıyorum ama bir türlü sonuç alamadım. Şimdiden teşekkür ederim.

Saygılarımla..



MASTER KOD:
// BU PROGRAMDA KESMEYE GEREK YOKTUR.

// DİKKAT YAZDIRMA ZAMANLARI SİMULASYONU HIZLANDIRMAK AMACI İLE 2MS YAPILMIŞTIR.

#include <18F4620.h>
#include <string.h>

#FUSES NOWDT                    
#FUSES XT                       
#FUSES NOBROWNOUT               
#FUSES NOLVP                    
#FUSES NOPUT
#FUSES NODEBUG
//#FUSES WRT
#FUSES NOCPD
#FUSES NOPROTECT

#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(d)

#define use_portb_lcd TRUE
#include <lcd.c>

#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // donanımsal rs232 iletşimi ayarları
#use rs232(baud=9600, xmit=pin_A0, rcv=pin_A1, parity=N, stop=1, STREAM= iletisim_2)   // yazılımsal rs232 ilitişimi ayarları

char giris[15];
char slave[100];
char paket[200];
int i,kb;
//char *k;

void main()
{
   setup_adc_ports (NO_ANALOGS) ;
   setup_adc (ADC_OFF) ;
   setup_psp (PSP_DISABLED) ;
   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1) ;
   setup_timer_1 (T1_DISABLED) ;
   setup_timer_2 (T2_DISABLED, 0, 1) ;
   setup_comparator (NC_NC_NC_NC) ;
   setup_vref (FALSE) ;
   setup_CCP1 (CCP_OFF) ;
   setup_CCP2 (CCP_OFF) ;
     
   set_tris_a (0x00);
   output_a (0x00) ;
   
   set_tris_b (0x00);
   output_b (0x00) ;
   
   set_tris_c (0x80);
   
   set_tris_d (0x00);
   output_d (0x00);
   
   lcd_init();
   //delay_ms(2);
   
   i=0;
   kb=0;
   
   printf(lcd_putc,"\fLutfen");  //asıl programda bu kısım olmayacak. Burası sadece şu anda olayı kavramak için var.
   printf(lcd_putc,"\nBekleyiniz");
   delay_ms(100);
   printf(lcd_putc,"\fOkuma Yapiliyor");
   delay_ms(50);

   while (1)
   {
      output_high(pin_d2);
      output_low(pin_d3);
      delay_ms(2);
      
      putc(i);

      //kb=kbhit(); 
      if(kbhit())
      {  
         output_low(pin_d2);
         output_high(pin_d3);
         delay_ms(2);
         
         gets(giris);
         delay_ms(2);
         
         slave[i]=giris;
         delay_ms(10);
         
         sprintf(paket,"%s,%s",paket,slave[i]);
         delay_ms(10);
         
         printf(lcd_putc,"\f%d numarali",i);
         printf(lcd_putc,"\nslave okunuyor");
         delay_ms(50);
         printf(lcd_putc,"\f%s",slave[i]);
         delay_ms(50);

         i++;
         kb=0;
       }
      
      if(i==3)
      {
      i=0;
         fprintf(iletisim_2,"%s,\n\r",paket);
//!         printf(lcd_putc,"\f%s",slave[0]);
//!         printf(lcd_putc,"\n%s",slave[1]);
//!         delay_ms(50);
//!         printf(lcd_putc,"\f%s",slave[2]);
//!         delay_ms(50);
         //sprintf(paket,"%s,%s,%s\n\r",slave[0], slave[1], slave[2]);
         //fprintf(iletisim_2,paket);

         //fprintf(iletisim_2,"%s,%s,%s\n\r",slave[0], slave[1], slave[2]);
      }
   }   
}

 


SLAVE0 KOD:
#include <16F877A.h>
#include <ds18b20.c>  

#FUSES NOWDT                    
#FUSES XT                       
#FUSES NOBROWNOUT               
#FUSES NOLVP                    
#FUSES NOPUT
#FUSES NODEBUG
#FUSES WRT_50%
#FUSES NOCPD
#FUSES NOPROTECT

#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(d)

//!#define use_portb_lcd TRUE // kapatılmış ise bu komutlar devrede lcd yoktur
//!#include <lcd.c>

#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)

char bayrak;
float sicaklik_ust,sicaklik_alt;
int secici;

#int_rda //seri haberleşme kesmesi
void seri_haberlesme()
{  
   enable_interrupts(int_rda);
   secici=getc();
   if (secici == 0) // giris ve veriye atanan string ifadeler aynı ise sonuc 0 döndürür.
   {
      bayrak = 1;
   }
}

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc (adc_off) ;
   
   setup_psp (PSP_DISABLED) ;
   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1) ;
   setup_timer_1 (T1_DISABLED) ;
   setup_timer_2 (T2_DISABLED, 0, 1) ;
   setup_comparator (NC_NC_NC_NC) ;
   setup_vref (FALSE) ;
   setup_CCP1 (CCP_OFF) ;
   setup_CCP2 (CCP_OFF) ;
   
   
   set_tris_a(0xFF);
 
   set_tris_b(0x00);
   output_b (0x00);
   
   set_tris_c (0x80);
   
   set_tris_d (0x00);
   output_d (0x00);
  
   //lcd_init ();   // kapatılmış ise bu komutlar devrede lcd yoktur
   
   enable_interrupts (int_rda);
   enable_interrupts (GLOBAL);
   
   //printf(lcd_putc,"\fTest Olcumu Icin"); // kapatılmış ise bu komutlar devrede lcd yoktur
   //printf(lcd_putc,"\nButona Basin");
   //delay_ms(250);
   
   while (1)
   {
      output_high(pin_d3); // sinyal beklerken kırmızı led yanacak.
      output_low(pin_d2);  // sinyal beklerken yeşil led yanmayacak.
      
      sicaklik_ust=ds1820_read();
      delay_ms(1);
      sicaklik_alt=ds1820_read1();
      delay_ms(1);
         
        // kapatılmış ise bu komutlar o pikte buton yoktur 
//!     if(input(pin_d1))
//!     {
//!         delay_ms(2);
//!         while(input(pin_d1));
//!         lcd_init ();
//!         delay_ms(1);
//!         printf(lcd_putc,"\fTest Olcumu");
//!         printf(lcd_putc,"\nYapiliyor");
//!         delay_ms(250);
//!         printf(lcd_putc,"\fSicaklik1=%1.1f%cC",sicaklik_ust,223);  
//!         printf(lcd_putc,"\nSicaklik2=%1.1f%cC",sicaklik_alt,223);
//!         delay_ms(250);
//!     
//!     }
      
     if (bayrak == 1)
     {
         delay_ms(2);
         
         output_low(pin_d3);
         output_high(pin_d2);
         delay_ms(250);
         
         printf("%f,%f\n\r",sicaklik_ust,sicaklik_alt);
        
//!      sprintf(data,"%f,%f",sicaklik_ust,sicaklik_alt); //bilgiyi paket haline getirdik.   
//!      k = data; // yukarda veri1'e "data" stringi atandı. Burada k="data" oluyor.  
//!      do
//!      {
//!         putc(*k);   // veri dizisinin tüm elemanlarını yolla
//!      }while(*(++k) != '\0');  
//!       putc(13); // gets için sonlandırma kodu. klavyedeki Enter tuşu  
       
      }
      bayrak=0;
  }

}


SLAVE1 KOD:
#include <16F877A.h>
#include <ds18b20.c>  

#FUSES NOWDT                    
#FUSES XT                       
#FUSES NOBROWNOUT               
#FUSES NOLVP                    
#FUSES NOPUT
#FUSES NODEBUG
#FUSES WRT_50%
#FUSES NOCPD
#FUSES NOPROTECT

#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(d)

#define use_portb_lcd TRUE // kapatılmış ise bu komutlar devrede lcd yoktur
#include <lcd.c>
#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)

char bayrak;
float sicaklik_ust,sicaklik_alt;
int secici;

#int_rda //seri haberleşme kesmesi
void seri_haberlesme()
{  
   enable_interrupts(int_rda);
   secici=getc();
   if (secici == 1) // giris ve veriye atanan string ifadeler aynı ise sonuc 0 döndürür.
   {
      bayrak = 1;
   }
}

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc (adc_off) ;
   
   setup_psp (PSP_DISABLED) ;
   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1) ;
   setup_timer_1 (T1_DISABLED) ;
   setup_timer_2 (T2_DISABLED, 0, 1) ;
   setup_comparator (NC_NC_NC_NC) ;
   setup_vref (FALSE) ;
   setup_CCP1 (CCP_OFF) ;
   setup_CCP2 (CCP_OFF) ;
   
   
   set_tris_a(0xFF);
 
   set_tris_b(0x00);
   output_b (0x00);
   
   set_tris_c (0x80);
   
   set_tris_d (0x02);
   output_d (0x00);
  
   //lcd_init ();   // kapatılmış ise bu komutlar devrede lcd yoktur
   
   enable_interrupts (int_rda);
   enable_interrupts (GLOBAL);
   
   //printf(lcd_putc,"\fTest Olcumu Icin"); // kapatılmış ise bu komutlar devrede lcd yoktur
   //printf(lcd_putc,"\nButona Basin");
   //delay_ms(250);
   
   while (1)
   {
      output_high(pin_d3); // sinyal beklerken kırmızı led yanacak.
      output_low(pin_d2);  // sinyal beklerken yeşil led yanmayacak.
      
      sicaklik_ust=ds1820_read();
      delay_ms(1);
      sicaklik_alt=ds1820_read1();
      delay_ms(1);
         
        
     if(input(pin_d1))
     {
         delay_ms(2);
         while(input(pin_d1));
         
         lcd_init();
         delay_ms(1);
         
         printf(lcd_putc,"\fTest Olcumu");
         printf(lcd_putc,"\nYapiliyor");
         delay_ms(250);
         
         printf(lcd_putc,"\fSicaklik1=%1.1f%cC",sicaklik_ust,223);
         printf(lcd_putc,"\nSicaklik2=%1.1f%cC",sicaklik_alt,223);
         delay_ms(250);
     
     }
      
     if (bayrak == 1)
     {
         delay_ms(2);
         
         output_low(pin_d3);
         output_high(pin_d2);
         delay_ms(250);
         
         printf("%f,%f\n\r",sicaklik_ust,sicaklik_alt);
        
//!      sprintf(data,"%f,%f",sicaklik_ust,sicaklik_alt); //bilgiyi paket haline getirdik.   
//!      k = data; // yukarda veri1'e "data" stringi atandı. Burada k="data" oluyor.  
//!      do
//!      {
//!         putc(*k);   // veri dizisinin tüm elemanlarını yolla
//!      }while(*(++k) != '\0');  
//!       putc(13); // gets için sonlandırma kodu. klavyedeki Enter tuşu  
       
      }
      bayrak=0;
  }

}


SLAVE2 KOD:
#include <16F876A.h> // PIC 16F876A programa tanıtılıyor
#include <ds18b20.c> // DS18B20 sıcaklık sensörleri programa tanıtılıyor  

#FUSES NOWDT                    
#FUSES XT                       
#FUSES NOBROWNOUT               
#FUSES NOLVP                    
#FUSES NOPUT
#FUSES NODEBUG
//#FUSES WRT
#FUSES NOCPD
#FUSES NOPROTECT

#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

//!#define use_portb_lcd TRUE // kapatılmış ise bu komutlar devrede lcd yoktur
//!#include <lcd.c>

#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)

char bayrak;
float sicaklik_ust,sicaklik_alt;
int secici;

#int_rda //seri haberleşme kesmesi
void seri_haberlesme()
{  
   enable_interrupts(int_rda);
   secici=getc();
   if (secici == 2) // giris ve veriye atanan string ifadeler aynı ise sonuc 0 döndürür.
   {
      bayrak = 1;
   }
}

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc (adc_off) ;
   //setup_psp (PSP_DISABLED) ;
   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1) ;
   setup_timer_1 (T1_DISABLED) ;
   setup_timer_2 (T2_DISABLED, 0, 1) ;
   setup_comparator (NC_NC_NC_NC) ;
   setup_vref (FALSE) ;
   setup_CCP1 (CCP_OFF) ;
   setup_CCP2 (CCP_OFF) ;

   set_tris_a(0xFF);
   
   set_tris_b(0x00);
   output_b (0x00); 
   
   set_tris_c (0x88);
  
   //lcd_init ();   // kapatılmış ise bu komutlar devrede lcd yoktur
     
   enable_interrupts (int_rda);
   enable_interrupts (GLOBAL);
   
   //printf(lcd_putc,"\fTest Olcumu Icin"); // kapatılmış ise bu komutlar devrede lcd yoktur
   //printf(lcd_putc,"\nButona Basin");
   //delay_ms(250);
   
   while (1)
   {
      output_high(pin_C5); // sinyal beklerken kırmızı led yanacak.
      output_low(pin_C4);  // sinyal beklerken yeşil led yanmayacak.
      
      sicaklik_ust=ds1820_read();
      delay_ms(2);
      sicaklik_alt=ds1820_read1();
      delay_ms(2);
 
//!     if(input(pin_C3))
//!     {
//!         delay_ms(2);
//!         while(input(pin_C3));
//!         lcd_init ();
//!         delay_ms(1);
//!         printf(lcd_putc,"\fTest Olcumu");
//!         printf(lcd_putc,"\nYapiliyor");
//!         delay_ms(250);
//!         printf(lcd_putc,"\fSicaklik1=%1.1f%cC",sicaklik_ust,223);  
//!         printf(lcd_putc,"\nSicaklik2=%1.1f%cC",sicaklik_alt,223);
//!         delay_ms(500);
//!     }
      
     if (bayrak == 1)
     {
         delay_ms(2);
         
         output_low(pin_C5);
         output_high(pin_C4);
         delay_ms(250);
         printf("%f,%f\n\r",sicaklik_ust,sicaklik_alt);
        
//!      sprintf(data,"%f,%f",sicaklik_ust,sicaklik_alt); //bilgiyi paket haline getirdik.   
//!      k = data; // yukarda veri1'e "data" stringi atandı. Burada k="data" oluyor.  
//!      do
//!      {
//!         putc(*k);   // veri dizisinin tüm elemanlarını yolla
//!      }while(*(++k) != '\0');  
//!       putc(13); // gets için sonlandırma kodu. klavyedeki Enter tuşu  
       
      }
      bayrak=0;
  }

}
;D