Hi-TechC ile GPS Cümlesi Okuyup kaydederken CR- "LF" mi beklemem lazım

Başlatan Kazım, 07 Mayıs 2013, 12:15:08

Kazım

Şimdi Arkadaşlar MTK3329 Gps Modulunden GPS cümlesini Alırken Çıktı şeklinin GPGGA için 

GPGGA,064951.000,2307.1256,N,12016.4438,E,1,8,0.95,39.9,M,17.8,M,,*65    olduğu yazıyor.

GPS bu cümleye otomatik olarak CR-LF bytelarını ekliyormu ?.

Yani ben GPS cümlesini PIC ile beklerken, sonlandığını anlamak için, " * " karakterine kadar kesme ile diziye kaydet, Sonra 2 defa daha kaydetmeden kesme yap Diyorum..Ardından Dizi indexini tekrar sıfır yap diyorum oluyor......Ama bunu Proteusta yukarıdaki cümleye göre yazdım.Henüz modülü almadım. Şimdi bu modul cümlenin arkasına bu CR - LF bytlarını eklerse benim kodumda cümle sonunu anlamam için, <LF> beklemem lazım.Bu CR - LF olayları sadece PC - RS232 için mi Yoksa ben PIC ile yaparsam - Modülü Configüre ederken veya Okurken bu CR - LF yazmam veya okurken beklemem gerekir mi ? PC için gerekiyor herhalde. sadece .. Sorum bu

http://inmotion.pt/documentation/diydrones/MediaTek_MT3329/mediatek_3329.pdf
 

BenC


Terminal programında bakarsan her cümle alt alta sıralı bir şekilde gelir.(CR:Cümleyi başa alır, LF:Bir alt satıra gider) bunu cümlenin sonundaki CRLF yapar. Terminalde gözükmeyebilir ama NMEA protokolünde bu vardır.

GPS verilerini mcu vb. bişeyle pars etmene yardımcı olması için cümlenin sonundaki CRLF leri alman doğru olur. Cümle $ işareti ile başlar, her bir veri bloğu  virgül ile ayrılır, sonunda da checksum  verisi gelir *3F gibi sonunda da CRLF gelir cümlenin bittiğini gösterir. Checksum la aldığın verinin doğruluğunu yaparsın.
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

Kazım

Benc Teşekkür Ederim..

örnek checksum *03

Ben stirngi * ' a kdar alıp sonra checksum 03 için de iki defa daha dizime hiçbir şey kaydetmiyor ve sonra Dizi indeksini sıfırdan başlatıyorum. Yani sen GPS Stringi içinde CRLF otomatik ekli diyorsun.Peki bunlar string dizinin içinde yine string olarak mı yoksa ekli iki byte daha var anlamına mı geliyor --doğru karakter " \n" bu mu . Yani " *03 "  ten sonra " \n " mi var. yada CRLF ekli GPS cümlesine örnek verebilirmisiniz.Tam cümle nedir misal GPGGA için

Yani dahası GPS cümlesini PIC UART ile okurken terminasyon ( sonlandırma ) denetlemesi için hangi karakteri kullanmalıyım.Bana RS232 terminal programı için gerekli CR lazım değil.ben Stringi PC değil LCD de göstreceğim

serhat1990

Merhabalar sorunuzu doğru anladığımı umarak cevap veriyorum yanlış algıladıysam kusuruma bakmayın.
Programınızda CR kodu için 0x0D  ( Hexadecimal )  , LF kodu için 0x0A ( Hexadecimal ) görüntüleyebilirsiniz ...

İyi çalışmalar dilerim ...

Kazım

Brenner8 'im var.Keşke DEbuggerum olsaydı.Diziyi büyük ayarlayıp.GPS stringi hangi karakterden sonra tekrar $ oluyor görürdüm. Ama mesajları yazrken farklı bir yötem aklıma geldi. örn ben Checksum 'ım * Inda Dizime kaydı bitirip. $ işaretini gördüğümde dizimin indexini sıfır yapar Yeni GPS cümlesini baştan diziye kaydedecdeğim.

Sizin önerilirinizde benim anlmadığı husu şu. GPS stringinde CR - LF bytları string dizinin içindemi yani " $............ *03,0x0d,0xA" mı ? bunu bilirsem kodda $ karakterini gözlem gerekmeyecek  yoksa ben "\n" görünce bitir mi demeliyim. yada doğru karakterin ne olduğunu soruyorum

Açıkçası datasheette örnek string

"GPGGA,064951.000,2307.1256,N,12016.4438,E,1,8,0.95,39.9,M,17.8,M,,*65"

Sizin demenize göre

"GPGGA,064951.000,2307.1256,N,12016.4438,E,1,8,0.95,39.9,M,17.8,M,,*65,13,10"     cr lf yi decimale çevirdim


YADA ayrı 2 byte

"GPGGA,064951.000,2307.1256,N,12016.4438,E,1,8,0.95,39.9,M,17.8,M,,*65" alıp sonra 1byte 0x0D ve 1byte 0x0A mı

serhat1990

Hocam siz uygulamanızda bence şöyle bir gözlem yapmalısınız kodları rastgele yazıyorum uygulamanıza göre düzenlersiniz...

Buffer = Verileri eklediğiniz buffer.
Buffersayaci = Her veri alımından sonra bir dizinin bir sonraki adresine atamak için sayaç .

if(buffer[buffersayaci]==0x0A) &&
 (buffer[buffersayaci-1]==0x0D))
 {
     // Buraya girerseniz veri alımı bitmiş olacaktır . Gelen frame yapısına göre .. 
 }


Umarım işinize yarar. İyi çalışmalar dilerim ...

Kazım

Teşekkür Ederim bende aynı yöntemle yaptımda GPS cümlenin sonua bu 0X0d ve 0X0A yı ekli olarak mı bize veriyor yoksa *03 'te mi bitiyor.merak ettiğim buydu.Çünkü Kafamı karıştıran Şu. Terminl programlarında örnekler verilmiş ama bildiği kadarıyla bu PC programlarında bu CR LF gibi bytları ekleyip eklemek bizim seçebildiğim yani Tik ile aktif edilebiliyor yani illaki şart olmuyor PC de.

Neyse tamam sonuçta string oalrak 0X0D = 13 bu durumda bir 1 ve sonra birde 3 gelcek ve son karakter 3 olacak.Aksi takdirde bu CR LF stringin dışında 2 ayrı byte olarak geliyor demektir. Yada GPS stirngini,n içindseyse şu "\n" gibi birşeydir.Sİz şimdi kodun başında olmadığınız için tam anlayamadınız herhalde sorunumu.Genede sağolun. Biraz uğraşım bulurum .Tabi sizin önerilerinizi dikakte alacağım. Tekrar Teşekkür Ederim.

EDit : Serhat bey siz 2 ayrı byte olarak almışsınız bende öyle yapacağım.Vakit Ayırdığınız için sağolun

serhat1990

Alıntı yapılan: graski - 07 Mayıs 2013, 14:25:26
Teşekkür Ederim bende aynı yöntemle yaptımda GPS cümlenin sonua bu 0X0d ve 0X0A yı ekli olarak mı bize veriyor yoksa *03 'te mi bitiyor.merak ettiğim buydu.Çünkü Kafamı karıştıran Şu. Terminl programlarında örnekler verilmiş ama bildiği kadarıyla bu PC programlarında bu CR LF gibi bytları ekleyip eklemek bizim seçebildiğim yani Tik ile aktif edilebiliyor yani illaki şart olmuyor PC de.

Neyse tamam sonuçta string oalrak 0X0D = 13 bu durumda bir 1 ve sonra birde 3 gelcek ve son karakter 3 olacak.Aksi takdirde bu CR LF stringin dışında 2 ayrı byte olarak geliyor demektir. Sİz şimdi kodun başında olmadığınız için tam anlayamadınız herhalde sorunumu.Genede sağolun. Biraz uğraşım bulurum .Tabi sizin önerilerinizi dikakte alacağım. Tekrar Teşekkür Ederim.

Ne demek Hocam , iyi çalışmalar dilerim . Bu tür çalışmalarda pc tarafında termite . exe programını öneririm .

iyi çalışmalar dilerim ...

Kazım

Eyvallah Serhat bey.   :)  İndirip denerim. Bir gün lazım olacaktır mutlaka. 


Dip Not :   Eyvallah, üç ayrı kelimeden oluşan Arapça bir cümle. 'Ey' veya '-iy', 'evet, tabii' gibi anlamlara gelir.
Bilhassa vav'la beraber kullanıldığında dilimizdeki ifadesiyle 'aynen öyle, tastamam' gibi manaları içine almaktadır.
'Tamam, peki' manasına pratik Arapça'da halihazırda 'eyva' şeklinde söylenişine halkımız aşinadır

burak ozturk

hocam söylediğiniz gibi '\n' karakteri alınca bitiyor, aslında '\r', '\n' ile bitiyor ancak son karakter her halikarda '\n' oluyor. cheksum olayıda $ karakterinde sonraki tüm nmea karakterlerinin XOR lanması ile bulunup cümle değerinin bozulup bozulmadıgını anlamanıza yarıyor. hafta sonu nmea cümlesi üreten gps ve bir cihazla daha çalışabilme imkanım olacak, süpriz bir durumla karşılaşır isem tekrar burdan belirtirim , kolay gelsin.

happy coding.

Kazım

Teşekkürler Burak bey . Sizin mesajınızdandan sonra biraz daha araştırdım ve wikipedia 'da şu konuyu buldum.

http://en.wikipedia.org/wiki/Newline

Alıntı Satır -->

Systems based on ASCII or a compatible character set use either LF (Line feed, '\n', 0x0A, 10 in decimal) or CR (Carriage return, '\r', 0x0D, 13 in decimal) individually ---  These characters are based on printer commands ---

--> diye devam ediyor

Yani tabii ki budurumda '\n' veya 0x0A veya 10 yazılarak stringin sonlandığı tespit edilebilir.

GPS 'i farklı ayarlara Configüre edebilmek için komut gönderirken ( TX )   - standart komut için arkasına gelecek checksum hesaplıyan bir programda MTK tarafanından yayınlanmış datashette linki var. Ama o kadar kurcalamayacağım şimdilik. Bu saniyede 1HZ olan defeault veri yenileme hızını desteklenen  10 Hz 'e kadar çıkarmak istersek işe yarayabilir. Yoksa pek şart değil. RX kısmı yeterli