CCS C interrupt'da serial'e string gönderme

Başlatan cengav4r, 05 Ağustos 2014, 09:53:35

cengav4r

İlk sorum(başlıkla pek alası yok), diyelim ki elimde 3 tane Gps var, pic üzerinden farklı portlardan Gpslerden gelen verileri nasıl alabilirim.

Yöntem1
fgets(gps1,iletisim_1);	//iletisim1 1.rs232
fgets(gps2,iletisim_2);	//iletisim2 2.rs232

Yöntem2
gps1=fgetc(iletisim_1);	//for kullanılacak
gps2=fgetc(iletisim_2);


İkinci yapmak istediğim şey serial'den gelen bilgi 'A' eşit olduğunda pic serial'e gps verisi göndersin.Ancak gps verisini bırakın 15 karakterden fazla veri gönderemedim.
#inr_rda kesmesinin içinde puts, putc ya da printf kullanarak uzun bir string'i nasıl gönderebilirim, kesmelerde serial'e gönderilen ifadenin belli bir boyutu var mı?. Yaptıklarım ve sonuçları aşağıdadır.Bütün yorumlara açığım.
#int_rda
{
...
e=getch();
if(e=='A')
      {
	char  gps[]="$GPGGA,111111.111,1111.1110,N,01111.0111,E,1,09,1,9,111,M,1,M,,*1E";
       output_high(pin_d0);
	--------------------------------------------
       printf("Work");	//gönderiyor, devre düzgün çalışıyor
	--------------------------------------------
       putc('c');	//gönderiyor, düzgün çalışıyor
	--------------------------------------------
       printf(gps);	//Bir kere serial gönderiyor (Bir kereye mahsus yazıyor daha sonra yazmıyor) sonra  donuyor
	--------------------------------------------
	puts(gps);	//Bir kere serial gönderiyor (Bir kereye mahsus yazıyor daha sonra yazmıyor) sonra , donuyor
       --------------------------------------------
       for(i=0;i<65;i++)
       {
       printf(gps[i]);	//Bir kereye mahsus yazıyor daha sonra yazmıyor, devre donuyor
       }
       ---------------------------------------------
       puts("wasejdhdjefvcbjhwvbsjhbjhaehdjvfbasdöjbfv");   Bir kereye mahsus yazıyor daha sonra yazmıyor,devre donuyor
	--------------------------------------------
	 putc('1');
          putc('2');
           putc('3');
            putc('4');
             putc('5');
              putc('6');
               putc('7');
                putc('8');
                 putc('9');
                  putc('0');
                   putc('1');
                    putc('2');
                     putc('3');
                      putc('4');	//gönderiyor, düzgün çalışıyor
					
	---------------------------------------------------
        putc('1');
          putc('2');
           putc('3');
            putc('4');
             putc('5');
              putc('6');
               putc('7');
                putc('8');
                 putc('9');
                  putc('0');
                   putc('1');
                    putc('2');
                     putc('3');
                      putc('4');
                        putc('5');	//İki kereye mahsus yazıyor daha sonra yazmıyor,devre donuyor

      }
      if(e=='B')
      {
         output_low(pin_d0);
      }

}

mir_as82

char  gps[]="$GPGGA,111111.111,1111.1110,N,01111.0111,E,1,09,1,9,111,M,1,M,,*1E";

Bu kullanım sanki pek doğru gelmedi bana. Burada tek tek $ G P G G ve devamındaki  karakterlerini mi göndermek istiyorsun?

cengav4r

Evet gps bilgisini rastgele yazdım. Tek tek veya toplu halde nasıl giderse (yani
puts("alivelideli"); toplu hali (toplu halde gidiyor ve çalışıyor benim sorunum uzun stringde)
   
char giden[12]; 
for(i=0;i<12;i++)
{putc(giden[i]);} //tek tek giden hali 
//zaten yukarda printf(gps[i]); denemiştim)

omereliusuk

#3
puts("wasejdhdjefvcbjhwvbsjhbjhaehdjvfbasdöjbfv\0");
 
Bir kereye mahsus yazıyor daha sonra yazmıyor,devre donuyor en sondaki \0 önemli. puts bunu buluncaya kadar işlem yapmaya çalışır. tabi yanlış bilmiyorsam.  bir de böyle dene.
char  gps[]={"$GPGGA,111111.111,1111.1110,N,01111.0111,E,1,09,1,9,111,M,1,M,,*1E\0"};
printf("%s",gps);
  bu da olabilir.\0 başlangıçta en sona ekle ne olur ne olmaz.

mir_as82

#4
hocam puts fonksiyonu kendisi yazının sonuna new line character yani \n ekliyor. Ama arkadaşın dediği gibi içinde null character dönene kadar içindeki karakterleri basmaya devam eder. Null character '\0'. Senin kendin null character i kendin eklemen gerek.

char  gps[]="$GPGGA,111111.111,1111.1110,N,01111.0111,E,1,09,1,9,111,M,1,M,,*1E"; // Bu kodda dizinin sonuna '\0' eklenmiş olur
Senin yazdığın kodda zaten son karakter olarak '\0' ekleniyor. Az önce C notlarıma baktım :). Bir daha eklemene gerek yok

cengav4r

Öncelikle cevaplar için teşekkür ederim.
@omereliusuk
puts("wasejdhdjefvcbjhwvbsjhbjhaehdjvfbasdöjbfv\0");

yaptığımda bir kereye mahsus bu ifadeyi basıyor daha sonra devre donuyor.

Ama puts("123456789012"); yaptığımda devre donmuyor ve bu ifadeyi sürekli basıyor.

output
123456789012
123456789012
123456789012
123456789012
123456789012
123456789012

Benim sorunum interrupt içinde veya kütüphane altında tanımlanan bir string ifade UZUN olunca serial'e basmıyor. Kısa (max 12 karakter) olunca normal bir şekilde basıyor.

omereliusuk


mir_as82

#7
Hocam yaptigina biraz daha ekleme yap. Bunu anlarsin.puts("1234567890123456789012345678901234");
Hani uzun olduğunda sorun var mi yok mu bu şekilde ogrenirsin.

cengav4r

#8
Alıntı yapılan: omereliusuk - 05 Ağustos 2014, 18:37:25
printf("%s",gps);

bunu denedin mi?
@omereliusuk,Hocam denedim olmadı. for döngüsüyle putc kullandım(printf("%c",gps);///putc("%c",gps);  ) tek tek bassın diye yine olmadı.

Alıntı yapılan: mir_as82 - 05 Ağustos 2014, 20:33:47
Hocam yaptigina biraz daha ekleme yap. Bunu anlarsin.puts("1234567890123456789012345678901234");
Hani uzun olduğunda sorun var mi yok mu bu şekilde ogrenirsin.
@mir_as82, Hocam anlayamadım mesajınızı.(zaten puts("1234567890123");'dan  fazlasını sadece 1 kere serial'e gönderiyor daha sonra devre kitleniyor.