關於GPS擷取字串 |
尚未結案
|
bluecola
一般會員 發表:3 回覆:5 積分:1 註冊:2004-09-17 發送簡訊給我 |
我參考過這篇http://delphi.ktop.com.tw/topic.php?topic_id=41102不過還是沒辦法解決我的問題.
我是想要把GPS擷取到的字串,依逗號隔開欄位一個個讀取出來,
譬如: $GPGGA,072509.999,2259.7264N.....
讀取出的資料為
1->GPGGA
2->072509.999
3->2259.7264N
4->.... 這是我的部分程式碼...
void CALLBACK CntIrq(int port)
{
int rLen,i,DotPos ;
char *buf=new char[1024];
String Buf,Buf2;
//給一個空間存資料
rLen = sio_read(port,buf , 1024); //讀取資料
if (rLen == 0) return; //若無資料則跳出
Buf = AnsiString(buf,rLen); if (Buf.Pos('$')<1) return;
else
{
i=0;
Form1->mReceive->Text=" ";
do
{
DotPos =Buf.Pos(',');
if(DotPos==0) break;
Buf2 = Buf.SubString(1,DotPos-1);
Form1->mReceive->Text=Form1->mReceive->Text IntToStr(i 1)
"->" Buf2 '\r' '\n';
Buf=Buf.Delete(1,DotPos);
i ;
if(i>49) break;
}while (1);
}
} 可是,我跑出來的都只有
1->GPGGA
後面就沒有跑出來了... 想請問各位大大,是哪裡出問題了?!該怎麼修改呢?!謝謝!
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
bluecola 您好: 依您程式測試的結果,可能的問題有兩個:
1.您讀入資料後的處理方式會漏掉最後一項,修改如下方程式碼所示。
2.我是用假設的方式:Buf = "$GPGGA,072509.999,2259.7264N";發現還是可以讀出第二筆,所以您可先將讀入的資料列出觀察一下,有沒有可能是讀入時資料就漏掉了。
供您參考。
if (DotPos==0 && Buf.Length()>0 ) { Form1->ListBox1->Items->Text=Form1->ListBox1->Items->Text IntToStr(i 1) "->" Buf2 '\r' '\n'; break; }RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### |
bluecola
一般會員 發表:3 回覆:5 積分:1 註冊:2004-09-17 發送簡訊給我 |
引言: bluecola 您好: 依您程式測試的結果,可能的問題有兩個: 1.您讀入資料後的處理方式會漏掉最後一項,修改如下方程式碼所示。 2.我是用假設的方式:Buf = "$GPGGA,072509.999,2259.7264N";發現還是可以讀出第二筆,所以您可先將讀入的資料列出觀察一下,有沒有可能是讀入時資料就漏掉了。 供您參考。謝謝您! 之前我就大約知道可能是第二種的問題... 而且第一種我試過了,結果還是一樣,所以肯定是第二種了... 只是不曉得該怎麼解決問題呢?!if (DotPos==0 && Buf.Length()>0 ) { Form1->ListBox1->Items->Text=Form1->ListBox1->Items->Text IntToStr(i 1) "->" Buf2 '\r' '\n'; break; }RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### |
李國維
高階會員 發表:42 回覆:287 積分:235 註冊:2003-02-07 發送簡訊給我 |
bluecola:
小弟之前有簡單的測試過GPS.大約的做法如下
你可以參考一下,小弟是用TStringList來處理
void __ fastcall Form1::DecodeGPS(AnsiString sData) { TStringList *SLGPSData = new TStringList(); SLGPSData->CommaText = sData; //Code // . // . // . delete SLGPSData; }舉例來說如果你輸入的字串是$GPGGA,072509.999,2259.7264N..... 那SLGPSData->String[0]就是$GPGGA,SLGPSData->Strings[1]就是072509.999 以此類推. 那至於如何判斷小弟的作法是利用MOXA的PCOMM 你參考一下 void __fastcall Form1::Timer1() { char buf[255]; AnsiString sTmp=""; int i; int len; len = sio_read( _ComPort ,buf,255); for ( i = 0 ; i < len ; i ) { if (buf[i] == 10) { if (sTmp.Pos("$GPGGA") > 0) DecodeGPS(sTmp); sTmp = ""; } else { sTmp = String(buf[i]); } } } //--------------------------------------------------------------------發表人 - 李國維 於 2004/11/25 10:39:59 |
bluecola
一般會員 發表:3 回覆:5 積分:1 註冊:2004-09-17 發送簡訊給我 |
|
李國維
高階會員 發表:42 回覆:287 積分:235 註冊:2003-02-07 發送簡訊給我 |
bluecola:
你可以先用終端機去判斷資料的正確性.如果資料無誤.
那就是你在處理RS232的程式上面去ㄌ問題.
我是建議你採取下列的方式.
先把完成的一筆資料讀取後.在去做資料的處理.
void __fastcall Form1::Timer1() { char buf[255]; AnsiString sTmp=""; int i; int len; len = sio_read( _ComPort ,buf,255); for ( i = 0 ; i < len ; i ) { if (buf[i] == 10) //判斷是否換行 { if (sTmp.Pos("$GPGGA") > 0) DecodeGPS(sTmp); sTmp = ""; } else { sTmp = String(buf[i]); } } } //--------------------------------------------------------------------至於你的程式中有一行if(i>49) break; 這一行我不懂他的用意.因為有可能GPS是收不到訊號的 所以會導致經緯度是0.你CHECK看看 |
bluecola
一般會員 發表:3 回覆:5 積分:1 註冊:2004-09-17 發送簡訊給我 |
李國維大哥您好!
我有用終端機check過資料,是沒有問題的.
我執行下面的程式時,debug會出現
"Call to undefined function 'DecodeGPS'"該怎麼解決呢?!
至於我程式中的if(i>49) break;
i指的是欄位的數目,我預設的太多了,
譬如: $GPGGA,072509.999,2259.7264N.....
讀取出的資料為
1->GPGGA
2->072509.999
3->2259.7264N
4->....
i指的就是前面的1.2.3.4......
非常謝謝您的幫忙!
引言: bluecola: 你可以先用終端機去判斷資料的正確性.如果資料無誤. 那就是你在處理RS232的程式上面去ㄌ問題. 我是建議你採取下列的方式. 先把完成的一筆資料讀取後.在去做資料的處理.void __fastcall Form1::Timer1() { char buf[255]; AnsiString sTmp=""; int i; int len; len = sio_read( _ComPort ,buf,255); for ( i = 0 ; i < len ; i ) { if (buf[i] == 10) //判斷是否換行 { if (sTmp.Pos("$GPGGA") > 0) DecodeGPS(sTmp); sTmp = ""; } else { sTmp = String(buf[i]); } } } //--------------------------------------------------------------------至於你的程式中有一行if(i>49) break; 這一行我不懂他的用意.因為有可能GPS是收不到訊號的 所以會導致經緯度是0.你CHECK看看 |
李國維
高階會員 發表:42 回覆:287 積分:235 註冊:2003-02-07 發送簡訊給我 |
bluecola:
1."Call to undefined function 'DecodeGPS'"表示無法呼叫未定義的功能.
你看看你.h檔案有沒有宣告,舉例來說.我要宣告DecodeGPS這各Function,
必須有兩各步驟.
(1)在.h檔中.依照你的功能考量.將void __fastcall DecodeGPS();這行宣告在private或是public中
(2)在.cpp中.在撰寫演算法則.
void __fastcall TForm1::DecodeGPS() { TStringList *SLGPSData = new TStringList(); SLGPSData->CommaText = sData; //Code // . delete SLGPSData; }2.資料的準確性.建議你先不要做資料的處理.你先單純的將資料讀入.然後顯示出來.你看看資料會不會LOSE,如果會那就是你在處理RS232時候發生錯誤. |
bluecola
一般會員 發表:3 回覆:5 積分:1 註冊:2004-09-17 發送簡訊給我 |
|
李國維
高階會員 發表:42 回覆:287 積分:235 註冊:2003-02-07 發送簡訊給我 |
bluecola:
我試過你的部份程式碼基本上是可行的.不過我有小改一些部份你看看
AnsiString Buf,Buf2; int rLen,i,DotPos; Buf = "$GPGGA,093340,2504.8989,N,12134.1433,E,2,04,5.8,35.8,M,017.0,M,4.0,631*50"; if (Buf.Pos('$')<1) return; else { i=0; do { DotPos =Buf.Pos(','); if(DotPos==0) { //因為你的判斷法會Lose最後一各資料.所以補上這各部份 Form1->mReceive->Text=Form1->mReceive->Text IntToStr(i 1) "->" Buf '\r' '\n'; return; } else { Buf2 = Buf.SubString(1,DotPos-1); Form1->mReceive->Text=Form1->mReceive->Text IntToStr(i 1) "->" Buf2 '\r' '\n'; Buf=Buf.Delete(1,DotPos); i ; } //if(i>49) break; }while (1); }所以我猜測你可能需要在if (Buf.Pos('$')<1) return;這段程式前 做一些處理.確定是一筆完整的資料(我所謂的完整資料是指你判斷一下Buf的內容) 如果方便的話.留下你的E-Mail我把我之前寫的測試程式寄給你. 感覺上這各問題不大.好像只是其中的一個小部份出了錯誤.. 多多利用 |
bluecola
一般會員 發表:3 回覆:5 積分:1 註冊:2004-09-17 發送簡訊給我 |
李國維大哥您好!
非常感謝您的熱心,不過我知道問題是出在哪了!
就是rLen = sio_read(port,buf , 1024)每次讀進來的位元不一定,
所以才會造成節取字串上的錯誤.
我現在試著用state machine去寫寫看!
希望能解決問題.
有問題再請您多多指教囉^^感謝~~~
引言: bluecola: 我試過你的部份程式碼基本上是可行的.不過我有小改一些部份你看看AnsiString Buf,Buf2; int rLen,i,DotPos; Buf = "$GPGGA,093340,2504.8989,N,12134.1433,E,2,04,5.8,35.8,M,017.0,M,4.0,631*50"; if (Buf.Pos('$')<1) return; else { i=0; do { DotPos =Buf.Pos(','); if(DotPos==0) { //因為你的判斷法會Lose最後一各資料.所以補上這各部份 Form1->mReceive->Text=Form1->mReceive->Text IntToStr(i 1) "->" Buf '\r' '\n'; return; } else { Buf2 = Buf.SubString(1,DotPos-1); Form1->mReceive->Text=Form1->mReceive->Text IntToStr(i 1) "->" Buf2 '\r' '\n'; Buf=Buf.Delete(1,DotPos); i ; } //if(i>49) break; }while (1); }所以我猜測你可能需要在if (Buf.Pos('$')<1) return;這段程式前 做一些處理.確定是一筆完整的資料(我所謂的完整資料是指你判斷一下Buf的內容) 如果方便的話.留下你的E-Mail我把我之前寫的測試程式寄給你. 感覺上這各問題不大.好像只是其中的一個小部份出了錯誤.. 多多利用>>< face="Verdana, Arial, Helvetica"> |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |