前回のプログラムは、GPSモジュールから来た情報をそのままUSBのシリアルに送っていただけである。
ただの通信テストに用いる場合に用いる手段である。
実際にはGPSモジュールから読み込んだデータを加工する必要があるので、変数に代入しておかないとならない。
ここでトラブルケースが多いので記載しておく。
手法としてはいくつかあるので、一つのサンプルとして受け止めてもらえればありがたい。
事実、大会で実際に使用したプログラムとは手法が違う。なぜ違う手法を使ったのか考えてもらいたい。
さて、プログラムの説明である。
Loopの中でBufferを監視しており、Bufferに何か入ったらGPS_Readという関数を呼び出している。
関数の中では、改行文字(アスキーコード 0x0A:Line feed)を検出するまでWhileループしている。
ここで再度Bufferが空かどうか確認しているのは、Bufferが空な状態で読んでしまうと、-1(0xFF)を受信してしまうことを恐れている。
Bufferが空でなければ1文字読みだして返り値用の変数に順次1文字づつ格納している。
最後に改行文字(今回はLine Feed文字)が来た後に、0x0を書き込み文字列の終わりであることを示している。この0x0が入った以降は、ゴミが入っていても文字列としては無視されるので、わざわざ消す必要がない。
文字列に入った文字はシリアルモニタに出力している。
この後の必要部分の抜き出し等は純然なプログラミングの世界となるので、他のWebや文献を参考にしてほしい。
#include <SoftwareSerial.h> // Software Serial library SoftwareSerial GPS_Serial(5,6); // 5:RXD, 6:TXD void GPS_Read(char *SoftSerialBuffer){ int i = 0; // Move first character position char read_ch; while (1) { if (GPS_Serial.available()) { // Check empty buffer read_ch = GPS_Serial.read(); // Read one character from buffer SoftSerialBuffer[i] = read_ch; // Copy reading character to return-variable if (read_ch == 10) break; i++; } } SoftSerialBuffer[i] = '\0'; // Set end-of-string as '\0' } void setup() { //***** set serial port speed (bps) Serial.begin(115200); // USB GPS_Serial.begin(9600); // Software Serial setting for GPS module } void loop() { char GPS_Data_Raw[255]; // Buffer size is 254 characters. Serial.println("Loop"); // Eye catcher if (GPS_Serial.available()) { // Check empty buffer GPS_Read(GPS_Data_Raw); // Call GPS_Read function routine Serial.println(GPS_Data_Raw); } }