GPSロガー その2

前回言っていたGPSロガーのプログラムについて紹介したいと思います。Arduinoのプログラムを参考にSTM32F1に書き直している感じです。適当なことを書いていると思うので、間違っている・意味不明な部分がありましたら指摘してください。

GPSモジュールから送られてきたデータの受信部分のプログラム

int cnt = 0;
int8_t GPSData[256] =
{ 0 };
char *gpsTime, *gpsLat, *gpsLong, *azimuth, *status; // 個別データ用の文字列用ポインタ
while (1){

if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE ) != RESET){
GPSData[cnt] = (int8_t) USART_ReceiveData(USART1 );
if (GPSData[cnt] == ‘\n’)
break;
cnt++;
}
if (cnt > 250)
break; 
}

charで初期化している*変数は取得するセンテンスによって異なります。GPSのNMEAフォーマットを参考にしました。
USART1(5Vトレラントピン)で改行コードまでGPSData[cnt]に値を格納していきます。if~はもし改行コードが見つからない場合、バッファが溢れそうになると強制終了するようにしています。

受け取ったGPSのデータの処理

if (0 == strncmp(“$GPRMC”, GPSData, 6)){
strtok(GPSData, “,”);
gpsTime = strtok(NULL, “,”); // UTC時刻の抽出
status = strtok(NULL, “,”); //GPSのステータス V:無効 A:有効
gpsLat = strtok(NULL, “,”); // 緯度の抽出
strtok(NULL, “,”);
gpsLong = strtok(NULL, “,”); // 経度の抽出
strtok(NULL, “,”);
strtok(NULL, “,”);
azimuth = strtok(NULL, “,”); // 真北に対しての度の抽出

strncmp関数(GPSのプログラム書いていて初めて使用した)を使い、GPSDataに格納された文字列の先頭6文字と$GPRMCを比較し一致していたら0を返し、if以下に入る。strtok関数(これも初めて使った)でGPSDataの文字列を “,”区切りで切り、各変数に代入していきます。

今回は文字ばかりですみません。プログラムが完成したらどこかにあげたいですね

GPSロガー その2

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中