關於gps資料抓取問題(使用C++ Builder 6開發)

先付上程式碼 rs232跟結構都寫好了,這是判斷的程式碼部分 while (hPort != INVALID_HANDLE_VALUE) { WaitCommEvent (hPort, &dwCommModemStatus, 0); if (dwCommModemStatus & EV_RXCHAR) { if ((dwBytesTransferred == 1)&(Byte == '$')) {char info [ ] = {'\0'}; int i, j; for (i =... show more 先付上程式碼
rs232跟結構都寫好了,這是判斷的程式碼部分
while (hPort != INVALID_HANDLE_VALUE)
{
WaitCommEvent (hPort, &dwCommModemStatus, 0);
if (dwCommModemStatus & EV_RXCHAR)
{
if ((dwBytesTransferred == 1)&(Byte == '$'))
{char info [ ] = {'\0'};
int i, j;
for (i = 1; i <= 5; i++)
{ ReadFile (hPort, &Byte, 1, &dwBytesTransferred, 0);
strcat(info, &Byte); }
char GPS_info[ ]={'\0'};
j = 0;
do
{ReadFile (hPort, &Byte, 1, &dwBytesTransferred, 0);
if (Byte != ',')
{strcat(GPS_info, &Byte);}
else
{j = j +1;
if ((info[1]== 'G')&(info[2]=='P')&(info[3]=='G')&(info... 'A'))
{ if (j == 1) GGA_info.strUttcTime = GPS_info;
if (j == 2) GGA_info.varLatitude = GPS_info;
if (j == 3) GGA_info.strNSIndicator = GPS_info;
if (j == 4) GGA_info.varlongitude = GPS_info;
if (j == 5) GGA_info.strEWIndicator = GPS_info;
if (j == 6) GGA_info.strPositionFix = GPS_info;
if (j == 7) GGA_info.strSatsUsed = GPS_info;
if (j == 8) GGA_info.strIIDOP = GPS_info;
if (j == 9) GGA_info.strAltitude = GPS_info;
if (j == 10) GGA_info.strAltUnits = GPS_info;
if (j == 11) GGA_info.strGeoid = GPS_info;
if (j == 12) GGA_info.strSepUnits = GPS_info;
if (j == 13) GGA_info.strDgpsAge = GPS_info;
if (j == 14) GGA_info.strDgpsid = GPS_info;}
GPS_info = '\0';
}
}
while (dwBytesTransferred == 1);
}
}
}
這台gps資料進來後會是像以下這樣
$GPGGA,48428.54,......(以下略)
他們之間是用","做分閣,所以有寫道判斷","的部分
而希望步驟為這樣
資料進來>判斷點把資料分開>判斷開頭的字元>找到對應結構並放入資料
>放完後清空GPS_info>等待下一個資料
而現組譯後,會有錯誤
錯誤都是
if (j == 數值) 結構定義子.結構內成員 = GPS_info;
例如:(if (j == 1) GGA_info.strUttcTime = GPS_info;)
這一系列的產生的
而錯誤全為
[C++ Error] gps1.cpp: E2277 Lvalue required

而且
GPS_info = '\0';
清空已定義的GPS_info這一段組譯也是不通過,錯誤依然為
[C++ Error] gps1.cpp: E2277 Lvalue required

請問是否那邊有錯誤呢?
又如何更正呢?

以及
strcat用法
若我這樣設定
strcat(A,B)這樣會把A跟B給結合對吧?
例如A="G" B="P"
strcat(A,B)候
會變成A="GP"
這是我的想法,但是那A為什麼卻還是被認定成字元呢?
因為有高手能幫我解答
以上感激
Update: 先付上我結構程式碼
struct GGA
{
char strUttcTime [20];
char varLatitude [20];
.
.
}GGA_info;
(因為字數關係省略)
Update 2: 先感謝shlinho的回答
但我在書上看到的結構用法
都是說

struct A
{
int a;
int b;
}A_info;

A_info.a=5;
這樣的話a就會被放入5

還是說因為是字串的關係所以要使用
strcpy呢?
以上期待指教
Update 3: 再次感謝shlinho的解答
"你的 info 與 GPS_Info 操作有誤"這點
若我改成這樣
char info [6];(這邊資料只有6英數子)
char GPS_info[100];(這邊可能很多)
是否正確呢?

還有關於
A_info.a=5;
shlinho大,你的意思是說,這種寫法,並不支援字串的傳輸
所以要用strcpy?是這樣意思嘛?
Update 4: 還有有人說
strcat(info, &Byte);
是有問題的,但我在組議上是可以通過的
可否也請shlinho幫忙看看呢?

最後還有一個
GPS_info跟info,都要在清空後使用
如何清空已經定義過的字串呢?

以上感謝回覆,也希望能繼續賜教

PS.若覺得這樣回覆過於麻煩,可以利用小弟及時通
good3125@yahoo.com.tw跟小弟聯絡
Update 5: 感謝阿福大的回答
strcat方面的問題,我已經了解了
程式也改寫過了
照shlinho大的方式,可以讓結構過關
也可以讓組譯,但產生出的來執行檔,還是會有問題
問題也如shlinho大所說,會有Access Violation
的錯誤..
但小弟也已經給了, info 與 GPS_Info 足夠的空間了
Update 6: 製於shlinho大,所提供的原始碼
想在這裡請教一下
因為小弟的程式,實際上除了GGA系列
還有GSA、GLL的其他的系列
若要把其他系列也寫進去,請問該寫在哪邊呢?
小弟真的只是C新手..
以上感謝回覆,也希望繼續賜教
Update 7: shlinho大,你所提供的程式碼
我已經改好,而且可以使用,也能組議通過
但是還是有些錯誤,我試圖
把linebuf給顯現出來,但是沒想到顯現出來的不如我預期
GGA應該會有14個資料
但是linebuf顯現出來,只有兩個
$GPGGA,48480.185(緯度)
後面的都沒有被讀到....
Update 8: 小弟猜想
是不是
q++;
pField = q + 1;
這段的問題呢?
而我也在這裡加上j++變成
q++;
pField = q + 1;
j++;
因為看shlinho大的程式,似乎沒有處理到j...
以上感謝回覆,也希望賜教
(總覺得指給20點好像太少了...)
Update 9: 也很好奇shlinho大,你q == 0xD || *q == 0xA
這段的意思,若可以煩請說一下
2 answers 2