|
本帖最后由 panthermx 于 2016-9-26 20:07 编辑
新人一个,断断续续在学习。上个星期才完成了一个PM2.5 + DTH11+ LCD1602 显示 空气质量、温度、湿度的手持式检测仪,用的18650电池升压板+充电板。
一直都是搬程序,然后自己改改。现在遇到难度大一点的,怎么也写不了。
现在遇到一个新的难题,通过从GPS截取信息获得 时间、日期、海拔、方位角信息的数值,转化成十六进制的字符显示,并分别将每个字符存在数组中。看了好多算法都不明白,一直都是搬程序,然后自己改改。现在遇到难度大一点的,自己写了一个,总编译不过去。麻烦各位大神给看一下。
这部分程序是搬过来改的。
程序中GPS信息提取完了没有写赋值,因为调用函数写不好。
犯了基本错误,程序就是0和1,十六进制是我们自己看的。
#include <SoftwareSerial.h>
char nmeaSentence[68];
String Time; //UTC时间,本初子午线经度0度的时间,和北京时间差8小时
String Date; //日期
String Direction; //方向
String Altitude; //海拔
String beiJingTime; //北京时间
SoftwareSerial GPSSerial(10, 11); // RX, TX
void setup() //初始化内容
{
Serial.begin(9600);
GPSSerial.begin(4800); //定义波特率9600,和我们店铺的GPS模块输出的波特率一致
GPSSerial.println("Wating...");
}
void loop() //主循环
{
// For one second we parse GPS data and report some key values
for (unsigned long start = millis(); millis() - start < 1000;) //一秒钟内不停扫描GPS信息
{
while (GPSSerial.available()) //串口获取到数据开始解析
{
char c = GPSSerial.read(); //读取一个字节获取的数据
//定义卫星信息存在状态
//定义海拔高度状态
switch(c) //判断该字节的值
{
case '$': //若是$,则说明是一帧数据的开始
GPSSerial.readBytesUntil('*', nmeaSentence, 67); //读取接下来的数据,存放在nmeaSentence字符数组中,最大存放67个字节
//Serial.println(nmeaSentence);
Time = parseGprmcTime(nmeaSentence);//获取GPS时间
Date = parseGprmcDate(nmeaSentence); //获取纬度值
Direction = parseGprmcDirection(nmeaSentence);//获取经度值
Altitude = parseGprmcAltitude(nmeaSentence);//获取速度值
if(Altitude > "") //当不是空时候打印输出
{
Serial.println("------------------------------------");
Serial.println("Altitude: " + Altitude);
}
if(Direction > "") //当不是空时候打印输出
{
Serial.println("Direction: " + Direction);
}
if(Date > "") //当不是空时候打印输出
{
GPSSerial.println("Date: " + Date);
}
if(Time > "") //当不是空时候打印输出
{
Serial.println("Time: " + Time);
beiJingTime = getBeiJingTime(Time); //获取北京时间
Serial.println("beiJingTime: " + beiJingTime);
}
}
}
}
}
String getBeiJingTime(String s)
{
int hour = s.substring(0,2).toInt();
int minute = s.substring(2,4).toInt();
int second = s.substring(4,6).toInt();
hour += 8;
if(hour > 24)
hour -= 24;
s = String(hour) +":"+String(minute) +":"+ String(second);
return s;
}
String parseGprmcTime(String s)
{
int pLoc = 0; //paramater location pointer
int lEndLoc = 0; //lat parameter end location
int dEndLoc = 0; //direction parameter end location
String gpsTime;
/*make sure that we are parsing the GPRMC string.
Found that setting s.substring(0,5) == "GPRMC" caused a FALSE.
There seemed to be a 0x0D and 0x00 character at the end. */
if(s.substring(0,4) == "GPRM")
{
//Serial.println(s);
for(int i = 0; i < 2; i++)
{
if(i < 1)
{
pLoc = s.indexOf(',', pLoc+1);
/*Serial.print("i < 8, pLoc: ");
Serial.print(pLoc);
Serial.print(", ");
Serial.println(i);*/
}
else
{
lEndLoc = s.indexOf(',', pLoc+1);
gpsTime = s.substring(pLoc+1, lEndLoc);
/*Serial.print("i = 8, pLoc: ");
Serial.println(pLoc);
Serial.print("lEndLoc: ");
Serial.println(lEndLoc);*/
}
}
return gpsTime;
}
}
String parseGprmcDate(String s)
{
int pLoc = 0; //paramater location pointer
int lEndLoc = 0; //lat parameter end location
int dEndLoc = 0; //direction parameter end location
String gpsDate;
/*make sure that we are parsing the GPRMC string.
Found that setting s.substring(0,5) == "GPRMC" caused a FALSE.
There seemed to be a 0x0D and 0x00 character at the end. */
if(s.substring(0,4) == "GPRM")
{
//Serial.println(s);
for(int i = 0; i < 10; i++)
{
if(i < 9)
{
pLoc = s.indexOf(',', pLoc+1);
/*Serial.print("i < 8, pLoc: ");
Serial.print(pLoc);
Serial.print(", ");
Serial.println(i);*/
}
else
{
lEndLoc = s.indexOf(',', pLoc+1);
gpsDate = s.substring(pLoc+1, lEndLoc);
/*Serial.print("i = 8, pLoc: ");
Serial.println(pLoc);
Serial.print("lEndLoc: ");
Serial.println(lEndLoc);*/
}
}
return gpsDate;
}
}
String parseGprmcDirection(String s)
{
int pLoc = 0; //paramater location pointer
int lEndLoc = 0; //lat parameter end location
int dEndLoc = 0; //direction parameter end location
String gpsDirection;
/*make sure that we are parsing the GPRMC string.
Found that setting s.substring(0,5) == "GPRMC" caused a FALSE.
There seemed to be a 0x0D and 0x00 character at the end. */
if(s.substring(0,4) == "GPRM")
{
//Serial.println(s);
for(int i = 0; i < 9; i++)
{
if(i < 8)
{
pLoc = s.indexOf(',', pLoc+1);
/*Serial.print("i < 8, pLoc: ");
Serial.print(pLoc);
Serial.print(", ");
Serial.println(i);*/
}
else
{
lEndLoc = s.indexOf(',', pLoc+1);
gpsDirection = s.substring(pLoc+1, lEndLoc);
/*Serial.print("i = 8, pLoc: ");
Serial.println(pLoc);
Serial.print("lEndLoc: ");
Serial.println(lEndLoc);*/
}
}
return gpsDirection;
}
}
String parseGprmcAltitude (String s)
{
int pLoc = 0; //paramater location pointer
int lEndLoc = 0; //lat parameter end location
int dEndLoc = 0; //direction parameter end location
String gpsAltitude;
/*make sure that we are parsing the GPRMC string.
Found that setting s.substring(0,5) == "GPRMC" caused a FALSE.
There seemed to be a 0x0D and 0x00 character at the end. */
if(s.substring(0,4) == "GPGG")
{
//Serial.println(s);
for(int i = 0; i < 10; i++)
{
if(i < 9)
{
pLoc = s.indexOf(',', pLoc+1);
/*Serial.print("i < 8, pLoc: ");
Serial.print(pLoc);
Serial.print(", ");
Serial.println(i);*/
}
else
{
lEndLoc = s.indexOf(',', pLoc+1);
gpsAltitude = s.substring(pLoc+1, lEndLoc);
/*Serial.print("i = 8, pLoc: ");
Serial.println(pLoc);
Serial.print("lEndLoc: ");
Serial.println(lEndLoc);*/
}
}
return gpsAltitude;
}
}
String charToString(char *c)
{
String val = "";
for(int i = 0; i <= sizeof(c); i++)
{
val = val + c;
}
return val;
}
String jinzhi(int z)
{
int sum=0;
float val=0;
char zanc[];
for(int i=0;i<10;i++)
{
val=z/16;
if(val<=16){break;}
}
for(int j=0;j<=sum;j++)
{
zanc[j]=int(val);
val=(val-int(val))*10;
return zancun;
}
}
这个部分是子函数,用来转换的,主要是这个写不过去。 String jinzhi(int z)
{
int sum=0;
int jdz;
double float val=0;
int zanc[3]={0,0,0,0};
char zifu[3]={"0","0","0","0"};
for(int i=0;i<10;i++)//除16来计算位数
{
if(val<=16){break;}
sum=sum+1;
val=z/16;
}
for(int j=0;j<4;j++) //反过来乘16得出个位、十位、百位、千位的16进制数值,赋值到数组
{
jdz = 3-(sum-j);
zanc[jdz]=int(val);
val=(val-int(val))*16;
return zifu;
if (sum-j=0){break;}
}
}
char zhuanh(int sl) //函数,将数据值转换成16进制字符
{
switch(sl)
{
case 0 :
return "0";
break;
case 1:
return "1";
break;
// 后面一直到F
}
} |
|