panthermx 发表于 2016-9-9 15:24:14

关于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:17:56

本帖最后由 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;
    }

panthermx 发表于 2016-9-12 21:42:51

275891381 发表于 2016-9-12 08:17
整形 建议直接用 string
例子:
需要char时 在strinng 转char


今天上班忙了一天,刚看到。第一部分看明白了一部分,以前没有想明白,不同字符定义不能混合打印输出。第二部分还不是很懂,看来自己的好好研究一下。自己对编程的基础能力还是太差了,感谢帮助。有问题会再请教,谢谢。
页: [1]
查看完整版本: 关于int数值转换16进制,字符显示,并用字符串录取每个16进制字符