全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2116
推到 Plurk!
推到 Facebook!

關於GPS擷取字串

尚未結案
bluecola
一般會員


發表:3
回覆:5
積分:1
註冊:2004-09-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-23 22:28:57 IP:163.23.xxx.xxx 未訂閱
我參考過這篇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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-23 23:23:18 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-24 23:43:39 IP:163.23.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-25 10:34:10 IP:220.130.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-26 00:24:20 IP:163.23.xxx.xxx 未訂閱
李國維大哥您好: 我想我現在比較困擾的問題就是GPS在讀入資料到buffer時資料就漏掉了, 因為GPS是不斷地讀入一整串的資料, 可是我的buffer好像都只能讀到前面一點點, 實在是不知道問題在哪?!該怎麼解決呢?!@@"
李國維
高階會員


發表:42
回覆:287
積分:235
註冊:2003-02-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-26 10:25:35 IP:220.130.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-29 22:40:19 IP:163.23.xxx.xxx 未訂閱
李國維大哥您好! 我有用終端機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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-30 10:47:18 IP:219.84.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-30 22:49:19 IP:163.23.xxx.xxx 未訂閱
李國維大哥您好! 關於第二點資料的準確性我之前有用程式跑過了,是沒有問題的. 所以我才無法理解為什麼資料處理時會有錯誤>"< 它只能讀出 1->GPGGA 2-> 3-> 4-> . . . 這樣的東西,可是裡面的資料只讀出第一個欄位GPGGA,其他都讀不到. 我之前用程式讀取資料再顯示是沒有lost的.
李國維
高階會員


發表:42
回覆:287
積分:235
註冊:2003-02-07

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-12-01 15:15:47 IP:219.84.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-12-02 18:07:45 IP:163.23.xxx.xxx 未訂閱
李國維大哥您好! 非常感謝您的熱心,不過我知道問題是出在哪了! 就是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">
系統時間:2024-04-25 21:16:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!