GPS GPRMC kodlarını parçalayıp okuma

Başlatan mcn, 21 Eylül 2011, 14:45:52

LukeSkywalker

Ben bu tür modüller ile oynarken, Gelen verileri bir tampon dizide toplayıp, virgülleri saydırarak verileri ayırıyordum mesela.

mcn

#16
Alıntı yapılan: Hasan Oguz - 21 Eylül 2011, 19:10:08
Merhabalar;

mcn arkadaşım GPS modülünü ne kadara, nereden aldınız?

Bilgiyi parçalamadığınız zaman bu şekilde veri geliyor değil mi?

GPS modülü bir arkadaşım verdi.

Evet,bilgiyi parçalamadığımızda o şekilde geliyor.

Alıntı yapılan: JKramer - 21 Eylül 2011, 19:17:08
getch() ile bir byte alırsınız; GpsPtr, 70 byte'lık bir dizi. Bence gps işine bir virgül koyun, öncelikle seri haberleşme konusunu halledin. Klavyeden gönderdiğiniz verileri kesme kullanarak bir diziye atıp işleyin mesela. Circular buffer konusunu inceleyin, CCS'in forumunda güzel örnekler var. Gps konusunda bilgim yok ama sürekli veri geliyorsa, bunları bir buffer'da saklayıp işinize yarayan kısımları  işlemeniz gerekecek. Mesela paketin başlangıcı $ işaretiyse buffer'da bunu arar, bulduktan sonra o noktadan paketin boyutu kadarlık kısmı GpsPtr'ye atarsınız.

Jkrammer yardımlarınız için teşekkürler.Tamda eksik olduğum konuları saydınız valla :D

"sürekli veri geliyorsa, bunları bir buffer'da saklayıp işinize yarayan kısımları  işlemeniz gerekecek. Mesela paketin başlangıcı $ işaretiyse buffer'da bunu arar, bulduktan sonra o noktadan paketin boyutu kadarlık kısmı GpsPtr'ye atarsınız."

işte tamda bunu yapmam lazım ama,nerden nasıl öğrenebilirim bilmiyorum.CCS infodan bulduğum kod bu işi yapmıyor mu???
Sanırım tırmalaya tırmalaya,ordan burdan inceleye inceleye öğreneceğiz bu işide.
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

mcn

Alıntı yapılan: maytere - 21 Eylül 2011, 19:27:54
Ben bu tür modüller ile oynarken, Gelen verileri bir tampon dizide toplayıp, virgülleri saydırarak verileri ayırıyordum mesela.

Hocam kod ile gösterebilir misiniz nasıl yapıyordunuz?
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

JKramer

Verdiğiniz kodu incelerseniz zaten virgülleri sayıp verileri ayırma işini yapıyor. Ama bunu yapabilmesi için öncelikle o gps string'ini dışarıdan almanız gerekiyor :). Siz dediğim gibi yeni proje açıp sadece seri haberleşmeyle ilgilenin.

mcn

Alıntı yapılan: JKramer - 21 Eylül 2011, 19:38:49
Verdiğiniz kodu incelerseniz zaten virgülleri sayıp verileri ayırma işini yapıyor. Ama bunu yapabilmesi için öncelikle o gps string'ini dışarıdan almanız gerekiyor :). Siz dediğim gibi yeni proje açıp sadece seri haberleşmeyle ilgilenin.

Benim aslında en baştan veri yapıları,algoritma vb konulardan başlamam lazım  :'( yazılım konusunda çok zayıfım gerçekten.

vaktimin kısıtlı olması zorluyor biraz beni,dediğiniz gibi string i dışarıdan alabilsem sanırım olacak iş.Var mıdır bunun basit bi yöntemi? :)
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

-Hasan-

Alıntı yapılan: mcnGPS modülü bir arkadaşım verdi.

Evet,bilgiyi parçalamadığımızda o şekilde geliyor.

Modelini verebilirmisiniz?

mcn

GlobalTop Tech markasının FGPMMOPA6B modeli hocam.
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

JKramer

#22
Eksiklikleri tespit edip düzeltmek size kalmış:

#include "16F887.h"

#fuses INTRC_IO,NOWDT,PUT,NOMCLR,PROTECT,CPD,BROWNOUT,NOIESO,NOFCMEN,NOLVP,NODEBUG,NOWRT,BORV21

#use delay(clock=4000000)

#use RS232(Baud=9600,XMIT=PIN_C6,RCV=PIN_C7,ERRORS)

#define DATA_SIZE 68

#include "stdlibm.h"
#include "gprmc.c"

GPRMCInfo *GpsData;

char GpsRawData[DATA_SIZE];

char Buffer[90];
char BufferPtrIN;
char BufferPtrOUT;
char RawPtr;

int1 NewData=0;

enum {IDLE,RECEIVING}State;

int1 CheckBuffer();

#INT_RDA
void receive_int()
{
	Buffer[BufferPtrIN]=getc();
	if(++BufferPtrIN>sizeof(Buffer))
		BufferPtrIN=0;
}

void main()
{
   GpsData = (GPRMCInfo *)malloc(sizeof(GpsData));

   enable_interrupts(INT_RDA);
   clear_interrupt(INT_RDA);
   enable_interrupts(GLOBAL);

   for(;;)
   {
   	if(CheckBuffer())
   	{
   	   GPRMC_decode(GpsRawData,GpsData);

			printf("\n\rValid: %c",GpsData->Valid);
			printf("\n\rDay: %d",GpsData->DT.Day);
			printf("\n\rMonth: %d",GpsData->DT.Month);
			printf("\n\rYear: %d",GpsData->DT.Year);
			printf("\n\rHour: %d",GpsData->DT.Hour);
			printf("\n\rMinute: %d",GpsData->DT.Minute);
			printf("\n\rSecond: %d",GpsData->DT.Second);
			printf("\n\rLatitude: %9.4f",GpsData->Latitude);
			printf("\n\rN_S: %c",GpsData->N_S);
			printf("\n\rLongitude: %9.4f",GpsData->Longitude);
			printf("\n\rE_W: %c",GpsData->E_W);
			printf("\n\rSpeed: %9.4f",GpsData->Speed);

			NewData=FALSE;
   	}
   }
}

int1 CheckBuffer()
{
	if(BufferPtrOUT!=BufferPtrIN)
	{
		switch(State)
		{
			case IDLE:
				if(Buffer[BufferPtrOUT]=='$')
				{
					GpsRawData[RawPtr]=Buffer[BufferPtrOUT];
					State=RECEIVING;
				}

				break;

			case RECEIVING:
				if(++RawPtr==(DATA_SIZE-1))
				{
					GpsRawData[RawPtr]='\0';
					NewData=TRUE;
					RawPtr=0;
					State=IDLE;
				}

				else
					GpsRawData[RawPtr]=Buffer[BufferPtrOUT];

				break;
		}

		if(++BufferPtrOUT>sizeof(Buffer))
			BufferPtrOUT=0;
	}

	return (NewData);
}