ひとつのプログラムにしたいのですが
(1)以前GPSで取得した測位データをRS232C通信でPCに表示するプログラムを作成するに当たって、多くの方に助言を頂けたことでなんとかNMEAデータを表示できるようになりました。
(2)そこで次の段階として、取得したNMEAデータに含まれる”緯度””経度””時刻”の要素のみ取り出して表示する方法として、strtok関数を用いたプログラムを教わり、用意した文章から必要な要素のみを出力する方法も確認できました。
(1)と(2)のプログラムをあわせて、受信したデータから緯度経度時刻のみを表示するプログラムを作成したいのですが、
assignment makes pointer from integer without
とコンパイル時に表示されてしまいます。ポインタの受け渡しに問題があるということでしょうか?どのように組み合わせれば受信データから必要なデータを表示できるようになるでしょうか。方法があればご教授お願いします。
以下が(1)と(2)のプログラムです。
(1)受信したデータをRS232C通信でPCに指定した行数表示するプログラム
#include<unistd.h>
#include<fcntl.h>
#include<strings.h>
#include<termios.h>
#include<stdio.h>
#define BAUDRATE B4800
#define MODEMDEVICE "/dev/ttyS0"
int main()
{
int fd, c, res;
int i=0;
int j=0;
struct termios oldtio, newtio;
unsigned char buf[512];
if((fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ))==-1){
perror(MODEMDEVICE);
exit(-1);
}
tcgetattr(fd, &oldtio); /*シリアルポートの設定を待避*/
bzero(&newtio, sizeof(newtio)); /*新しいポートの設定の構造体をクリア*/
newtio.c_cflag = (BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD);/*ボー:4800*/
newtio.c_iflag = (IGNPAR | ICRNL);
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
while (i==0) {
res = read(fd,buf,512);
buf[--res]=0; j++;
printf("%s\n",buf);
//j++;
if(j==48)i++; /*NMEAセンテンス1セットは24行(12種と1行ずつのスペース)なのでここでは48行で2セット分のループ*/
}
tcsetattr(fd, TCSANOW, &oldtio);
close(fd);
return(0);
}
(1)実行結果
$GPRMC,081312,A,3428.9433,N,13549.4905,E,0.0,0.0,060808,6.7,W,A*06
$GPRMB,A,,,,,,,,,,,,A,A*
$GPGSA,A,3,03,06,07,,16,,21,,25,27,,,2.3,2.0,1.0*34
・・と48行このようなNMEAセンテンスを表示します。
(2)NMEAセンテンスから時刻、緯度、経度のみを出力
#include <stdio.h>
#include <string.h>
#include <math.h>
char buf[512]="$GPRMC,143514,A,3428.9468,N,13549.4507,E,0.0,196.2,180708,6.7,W,A*05"; /*緯度経度時刻がすべて含まれているGPRMCからデータを取得したいのでGPRMCのモデルを1行用意*/
void pnmea(void) {
int utc;
double lat; /*緯*/
double lon; /*経*/
char ew; /*東西*/
char ns; /*南北*/
char stat;
char *p;
/*一行のNMEAセンテンスから時刻緯度経度のみを取り出すために、strtokで”,”ごとのトークンを得る*/
if ((p=strtok(buf,","))==NULL) return;
if (strcmp(p,"$GPRMC")!=0) return; /*センテンスの先頭は$GPRMCか?*/
if ((p=strtok(NULL,","))==NULL) return;
sscanf(p,"%d",&utc);
if ((p=strtok(NULL,","))==NULL) return;
stat=p[0];
if ((p=strtok(NULL,","))==NULL) return; /緯度*/
sscanf(p,"%lf",&lat);
if ((p=strtok(NULL,","))==NULL) return;
ns=p[0];
if ((p=strtok(NULL,","))==NULL) return; /*経度*/
sscanf(p,"%lf",&lon);
if ((p=strtok(NULL,","))==NULL) return;
ew=p[0];
if (stat!='A') return;
printf("%02d時%02d分%02d秒(UTC) ",utc/10000, (utc%10000)/100, utc%100);
if (ns=='N') printf("北緯"); else if (ns=='S') printf("南緯");
printf("%.0lf度%.4lf分",floor(lat/100.0), fmod(lat,100.0));
if (ew=='E') printf("東経"); else if (ns=='W') printf("西経");
printf("%.0lf度%.4lf分",floor(lon/100.0), fmod(lon,100.0));
printf("\n");
}
int main(void) {
pnmea();
return 0;
}
(2)実行結果
14時35分14秒(UTC) 北緯34度28.9468分東経135度49.4507分
(1)で得たデータを(2)でGPRMCか判別し、必要な部分を取り出し表示 したいと考えています。よろしくお願いします。