データ受信とGGAセンテンスの解析プログラム

シリアル通信でデータを受信し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 );
}

シリアル通信