シリアル通信でデータを受信しGGAセンテンスを解析するための、サンプルコードを示します。
使用言語:CCS C
int32 X; // 緯度 (int32は32ビット整数型) int32 Y; // 経度 // シリアル通信の初期設定 #use rs232( BAUD = 4800, XMIT=PIN_C6, RCV=PIN_C7, BITS=8, PARITY=N ) // GPSデータ受信処理 void GpsDataReceive() { char Receive, RxData[ 71 ]; char *cptr = RxData; do { Receive = getc(); *cptr++ = Receive; } while( Receive != '\r' ); Receive = getc(); // LFコード除去 // GGAセンテンスの判定 if( ( RxData[ 3 ] == 'G' ) && ( RxData[ 4 ] == 'G' ) && ( RxData[ 5 ] == 'A' ) ) { // GGAセンテンス解析処理へ SentenceGGA( RxData ); } } // GGAセンテンス解析 void SentenceGGA( char *RxData ) { char Table[ 5 ], *cptr; RxData += 14; // 緯度読み取り [ ddmm.mmm ] cptr = Table; *cptr++ = *RxData++; *cptr = *RxData++; Y = ( int32 )atol( Table, 2 ) * 60000; // 経度をx座標に変換 cptr = Table; *cptr++ = *RxData++; *cptr++ = *RxData; RxData+=2; // 小数点部分をスキップ *cptr++ = *RxData++; *cptr++ = *RxData++; *cptr = *RxData; Y += atol( Table, 5 ); } // 文字列を数値に変換(10進4バイト) [参考:標準文字処理関数] long atol( char *s, int number ) { long result = 0; int index = 0, i; char c; if( s ) { c = s[ index++ ]; } for( i = 0; i < number; i++ ) { result = 10 * result + (c - '0'); c = s[ index++ ]; } return result; }
使用環境 : Visual C++ 6.0
HANDLE hComm; // ファイルハンドラ // シリアル通信の初期設定 BOOL InitComPort() { // COMポートのオープン ::hComm = CreateFile( "COM1", // ファイル名 GENERIC_READ | GENERIC_WRITE, // オープン方法 0, // 共有モード NULL, // セキュリティ属性 OPEN_EXISTING, // 既存ファイルの処理 FILE_ATTRIBUTE_NORMAL, // ファイルの属性 NULL // テンプレートファイル ); DCB lpDCB; // 現在の通信条件を取得 if( !GetCommState( ::hComm, &lpDCB ) ) { return EXIT_FAILURE; } lpDCB.BaudRate = 4800; // 転送速度の指定 (4800bps) lpDCB.ByteSize = 8; // ビット長の指定 (8bit) lpDCB.Parity = NOPARITY; // パリティ方式 (パリティなし) lpDCB.StopBits = ONESTOPBIT; // ストップビット数の指定 (1bit) lpDCB.fOutxCtsFlow = 0; // 以下 フロー制御 lpDCB.fOutxDsrFlow = 0; lpDCB.fDtrControl = 0; lpDCB.fOutX = 0; lpDCB.fInX = 0; lpDCB.fRtsControl = 0; // 通信条件を設定 if( !SetCommState(::hComm, &lpDCB) ) { return EXIT_FAILURE; } return EXIT_SUCCESS; } // GPSデータ受信処理 void GpsDataReceive () { char RxData[ 71 ]; LPDWORD lpNumberOfBytesRead; ReadFile( ::hComm, RxData , 71, &lpNumberOfBytesRead, NULL ); }