关于int数值转换16进制,字符显示,并用字符串录取每个16进制字符
本帖最后由 panthermx 于 2016-9-26 20:07 编辑新人一个,断断续续在学习。上个星期才完成了一个PM2.5 + DTH11+ LCD1602 显示 空气质量、温度、湿度的手持式检测仪,用的18650电池升压板+充电板。
一直都是搬程序,然后自己改改。现在遇到难度大一点的,怎么也写不了。
现在遇到一个新的难题,通过从GPS截取信息获得 时间、日期、海拔、方位角信息的数值,转化成十六进制的字符显示,并分别将每个字符存在数组中。看了好多算法都不明白,一直都是搬程序,然后自己改改。现在遇到难度大一点的,自己写了一个,总编译不过去。麻烦各位大神给看一下。
这部分程序是搬过来改的。
程序中GPS信息提取完了没有写赋值,因为调用函数写不好。
犯了基本错误,程序就是0和1,十六进制是我们自己看的。
#include <SoftwareSerial.h>
char nmeaSentence;
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=int(val);
val=(val-int(val))*10;
return zancun;
}
}
这个部分是子函数,用来转换的,主要是这个写不过去。
String jinzhi(int z)
{
int sum=0;
int jdz;
double float val=0;
int zanc={0,0,0,0};
char zifu={"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=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
}
}
本帖最后由 275891381 于 2016-9-12 08:20 编辑
整形 建议直接用 string
例子:void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
int height=168;
float weight=72.5;
String gy = String("")+"Your Height="+height +", and Weight=" + weight;
Serial.println(gy);// 印到串口
}
需要char时 在strinng 转char
toCharArray()
Description
Copies the string's characters to the supplied buffer.
Syntax
string.toCharArray(buf, len)
Parameters
string: a variable of type String
buf: the buffer to copy the characters into (char [])
len: the size of the buffer (unsigned int)
float double 建议用dtostrf():
char* dtostrf(double _val,signed char _width, unsigned char prec, char* _s)
参数说明:
_val:要转换的float或者double值。
_width:转换后整数部分长度。
_prec:转换后小数部分长度。
_s:保存到该char数组中。
例子:
floatf=3.1415;
char c[];
dtostrf(f,1,2,c);
Serial.println(c);
//定义一个字符串
char s[]="///sensor1///ly///sensor1///PM2.5///100.70///";
//进行字符串拼接操作
strcat(s,c);
Serial.println(s);
需要string时然后在 char 转string
for(i=0;i<14;i++){
String d += c;
} 275891381 发表于 2016-9-12 08:17
整形 建议直接用 string
例子:
需要char时 在strinng 转char
今天上班忙了一天,刚看到。第一部分看明白了一部分,以前没有想明白,不同字符定义不能混合打印输出。第二部分还不是很懂,看来自己的好好研究一下。自己对编程的基础能力还是太差了,感谢帮助。有问题会再请教,谢谢。
页:
[1]