极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11754|回复: 2

关于int数值转换16进制,字符显示,并用字符串录取每个16进制字符

[复制链接]
发表于 2016-9-9 15:24:14 | 显示全部楼层 |阅读模式
本帖最后由 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
  }
}      
回复

使用道具 举报

发表于 2016-9-12 08:17:56 | 显示全部楼层
本帖最后由 275891381 于 2016-9-12 08:20 编辑

整形 建议直接用 string
例子:
  1. void setup() {
  2.   // put your setup code here, to run once:
  3.   Serial.begin(9600);
  4. }

  5. void loop() {
  6.   // put your main code here, to run repeatedly:
  7. int height=168;
  8. float weight=72.5;
  9. String gy = String("")+"Your Height="+height +", and Weight=" + weight;

  10. Serial.println(gy);  // 印到串口

  11. }
复制代码

需要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数组中。
例子:
float  f=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;
    }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-12 21:42:51 | 显示全部楼层
275891381 发表于 2016-9-12 08:17
整形 建议直接用 string
例子:
需要char时 在strinng 转char

今天上班忙了一天,刚看到。第一部分看明白了一部分,以前没有想明白,不同字符定义不能混合打印输出。第二部分还不是很懂,看来自己的好好研究一下。自己对编程的基础能力还是太差了,感谢帮助。有问题会再请教,谢谢。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-4 07:48 , Processed in 0.046197 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表