strtok() çalışmıyor ?

Başlatan koray692, 08 Şubat 2016, 16:16:27

koray692

merhaba arkadaşlar uart tan bilgileri alıp içinden belirli yerleri almak istiyorum  bir kaç deneme yaptım(uartsız) nasıl çalışacak diye ancak en basit bir örnekte bile sağlıklı çalıştıramadım.Aslında tam yapmak istediğim şey alınan kelime dizilerini ayrı ayrı değikenlere atamak ...Nasıl yapabilirim...?




EMP_Otto

Buradaki örnek işinize yarayabilir http://www.cplusplus.com/reference/cstring/strtok/
Ayrıca Example ın yanındaki dişli simgesine tıklayarak kodu online calıstırarak denemeler yapabilirsiniz.

İyi Çalışmalar...
Bu işler zordur,özveri ister...

koray692

daha öncede baktım evet o örnekte ve internetteki örneklerde çalışıyor ama mikrodenetleyici de ben çalıştıramadım.Burda ayırdıktan sonra nasıl değişkenlere aktaracağım onu bilemedim.BUrda mik  ro  El kelimelerini ayrı ayrı değişkenlere aktarmak istiyorum.


char x[10] ;

void main(){
while(1)
{

strcpy(x, strtok("mik,ro,El", ","));

}
}



EMP_Otto

Aşağıdaki gibi kullanabilirsiniz.İyi çalışmalar
#include <stdio.h>
#include <string.h>

int main ()
{
	int sayac=0;
	char bir[10];
	char iki[10];
	char uc[10];
  char str[] ="Mik,ro,el";
  char * pch;
  pch = strtok (str,",");
  while (pch != NULL)
  {
  	if(sayac==0)
  	{
  	   strcpy(bir,pch);
	}
	else if(sayac==1)
	{
		 strcpy(iki,pch);
	}
	else if(sayac==2)
	{
		 strcpy(uc,pch);
	}
    
    pch = strtok (NULL, ",");
    sayac++;
  }
    printf ("bir:%s\n",bir);
    printf ("iki:%s\n",iki);
    printf ("uc:%s\n",uc);
  return 0;
}
Bu işler zordur,özveri ister...

Karamel

bunu basitce while ile yapmak daha mantikli degilmi hocam? hatirladigim kadari ile stdio.h yada string.h headerlarindan birisini code a ekleyince 6kbyte alan isgali oluyordu? while ile ',' characteri tarayin. bulamadiginiz surece aktarmak istediginiz array e ana array i aktarin. virgul gelince while dan cikin?

koray692

#5
evet haklısınız o şekilde yapılmış bir kod var elimde ancak bu şekilde yapmayı da öğrenmek istedim ayrıca sizin dediğiniz tarzda yaptığımda debug yaparken mikroc compiler da çok uzun sürüyor adım adım ilk önce $ işaretini bulup sonra GGPA gibi bir kodu bulup ondan sonra virgüllerden ayırmak( gps ten gelen verileri) ...

mesaj birleştirme:: 08 Şubat 2016, 18:26:12

Mikroc compiler NULL u tanımıyor bir de  pch = strtok (0, ","); ne anlama geliyor ? null yerine 0 koyup çalıştırdım düzgün bir şekilde çalışıyor sorun çıkmadı..Teşekkürler yardımlarınız için..

kimlenbu

GPS verisi ayırmak için kullandığım fonksiyonum, ayıklamaya üşendim olduğu gibi ekliyorum

void GPSVerisiAyir(void)
{
	uint8_t verino=0;
	uint8_t *token;
	int virgul2=0;
	uint8_t x=0;
	uint8_t ilkvirgulbulundu=0;
	uint8_t tmpGPSVerisiHeader[]="$GPGGA";
	
	GPSVerisiFlag=0;
	GPSVerisiHazirmi=0;
	
	//ilk virgülün ve ikinci virgülün konumlari bulunuyor
	for(x=0;x<50;x++)
	{
		if(tmpStr100[x]==',' && ilkvirgulbulundu==0){ilkvirgulbulundu=1;}
		else if (tmpStr100[x]==',' && ilkvirgulbulundu==1){virgul2=x;break;}
	}
	
	//GPS verisi gelmeye basladi mi diye kontrol etmek icin $GPGGA verilerindeki virguller kontrol ediliyor
	//Bunun icin gelen verinin headerinin kontrol edilmesi gerekiyor. Bu sebeple gelen gps verisi
	//GPGGA mi diye ilk 6 karakter ayri bir diziye atiliyor.
	for (x=0;x<5;x++)
	{
		tmpGPSVerisiHeader[x]=tmpStr100[x];
	}
	
	
	//eger ikinci virgülün konumu sifir degilse ikinci ve ücüncü virgül arasinda veri var mi kontrol ediliyor
	//eger veri yoksa gps baglanamamistir.
	if(virgul2!=0)
	{
		if(tmpStr100[virgul2+1]==',' && !strcmp(tmpGPSVerisiHeader,"$GPGGA")) //eger ikinci virgulden sonraki karakter gene virgulse gps baglanamamistir.
		{
			GPSDurumu=0;
			if(tmpGPSDurumu!=GPSDurumu){tmpGPSDurumu=GPSDurumu;SSD1963_LCD_SDBMP(445,27,66,66,"gps2.bin");DebugMesaj("GPS baglanmadi GPSAyir dan cikiliyor           ",0,RED);}																																																		
			GPSVerisiYaz();
			return;
		}
		else if(tmpStr100[virgul2+1]!=',' && !strcmp(tmpGPSVerisiHeader,"$GPGGA"))
		{	
			GPSDurumu=1;
			if(tmpGPSDurumu!=GPSDurumu){tmpGPSDurumu=GPSDurumu;SSD1963_LCD_SDBMP(445,27,66,66,"gps1.bin");DebugMesaj("GPS baglandi.                                 ",0,GREEN);}
			
		}
	}
		
			token=strtok(tmpStr100,",");
			if (!strcmp(token,"$GPGGA"))
			{
				while (token!=NULL)
				{
					verino+=1;
					switch (verino)
					{
						case 2 : strcpy(GPS.SaatGPS,token);GPSSaatFormatla(); break;
						case 3 : strcpy(GPS.Enlem,token); break;
						case 4 : strcpy(GPS.EnlemHarf,token); break;
						case 5 : strcpy(GPS.Boylam,token); break;
						case 6 : strcpy(GPS.BoylamHarf,token); break;
						case 7 : strcpy(GPS.GPSFix,token); break;
 						case 8 : strcpy(GPS.UyduSayisi,token); break;
					}	//switch sonu				
					token = strtok(NULL,",");
				} //while sonu
				GPSVerisiYaz();
				GPSVerisiCount++;
				if (GPSVerisiCount==10){GPSVerisiCount=0;GPSVerisiGonder();}
			} //if sonu
			else if (!strcmp(token,"$GPVTG"))
			{
				while (token!=NULL)
				{
					verino+=1;
					switch (verino)
					{
						case 7 : strcpy(GPS.HizGPS,token); break;
					}	//switch sonu				
					token = strtok(NULL,",");
				} //while sonu
			} //else if sonu
			GPSVerisiHazirmi=1;
			

}

koray692