查看: 474|回复: 0

Arduino16进制字符串转ASCII(下)

[复制链接]

签到天数: 165 天

[LV.7]常住居民III

发表于 2021-6-20 00:18 | 显示全部楼层 |阅读模式
本帖最后由 topdog 于 2021-6-20 22:31 编辑

Arduino16进制字符串转ASCII(上)(简称:上文)基础上,举一反三,超越自我,提高难度,有一长串十六进制数字“48454C4C4F20574F524C4421”要求每两位以”0x“样式输出,再翻译成ASCII码整句打印。

输出的效果如下:
toCharArray.jpg

涉及的知识点:
1,String 转化成 char char_array[str_len],在Arduino String组函数中有自带的函数String.toCharArray(char_array, str_len),String函数中计算字符串的长度函数是String.length(),索引开始默认值为0,所以字符串实际长度要加一。
2,十六进制字符串转化成byte值一维数组,把字符串两位截取,程序中提供了两种截取方法,大家可以玩味一下。1 byte = 4 bit ,字符对应出相应的十进制数值,计算机在最后编译时会换算成对应的bit值,在此没有采用上文中计算求值的方法,而是用了十位的左移四位bit值再或个位bit值,这是bit计算方法来实现的。
3,ASCII 十六进制输出显示,在Arduino中数值都是用byte值来储存的,只有在显示时才有所不同。譬如前两位字符串48,通过计算求得十六进制对应的byte值是01001000被存储在芯片里面,如果要求十六进制输出就是:Serial.println(ASCIINumberByte[0], HEX),为了符合书写习惯前面加上”0x“,就是0x48。十进制输出就是:Serial.println(ASCIINumberByte[0],DEC),输出就是72。
4,byte值转化成ASCII对应的char输出,以H为例,char H = char 01001000,遍历第二步求得的byte值一维数组ASCIINumberByte[12],那么就把十六进制数字字符串翻译成ASCII打印来了。结果是:HELLO WORLD!
5,十六进制转化成十进制的第三种方法自定义函数char HexChangeDec(char ch),这个有些繁琐,其他两种参见《串口接收十六进制代码控制点灯》一文。

实现的程序:
void setup() {
  Serial.begin(115200);
  while (!Serial);

  String inputString = "48454C4C4F20574F524C4421";

  int str_len = inputString.length() + 1;
  char char_array[str_len];

  int ASCIINumber_len = str_len / 2;
  byte ASCIINumberByte[ASCIINumber_len];

  /*
    inputString.toCharArray(char_array, str_len);

    for (char i = 0; i < str_len; i++)
    {
    byte extract;
    char a = char_array[2 * i];
    char b = char_array[2 * i + 1];
    extract = HexChangeDec(a) << 4 | HexChangeDec(b);
    ASCIINumberByte[i] = extract;
    }
  */

  for (char i = 0; i < str_len; i++)
  {
    byte extract;
    char a = inputString.charAt(2 * i);
    char b = inputString.charAt(2 * i + 1);;
    extract = HexChangeDec(a) << 4 | HexChangeDec(b);
    ASCIINumberByte[i] = extract;
  }

  for (int j = 0 ; j < ASCIINumber_len; j++) {
    Serial.print("0x");
    Serial.println(ASCIINumberByte[j], HEX);
  }

  
  for (int k = 0 ; k < ASCIINumber_len; k++) {
    Serial.print(char (ASCIINumberByte[k]));
  }  
  Serial.println("");

  delay(100);
}

void loop() {
  ;
}

char HexChangeDec(char ch)
{
  char returnType;
  switch (ch)
  {
    case '0':
      returnType = 0;
      break;
    case  '1' :
      returnType = 1;
      break;
    case  '2':
      returnType = 2;
      break;
    case  '3':
      returnType = 3;
      break;
    case  '4' :
      returnType = 4;
      break;
    case  '5':
      returnType = 5;
      break;
    case  '6':
      returnType = 6;
      break;
    case  '7':
      returnType = 7;
      break;
    case  '8':
      returnType = 8;
      break;
    case  '9':
      returnType = 9;
      break;
    case  'A':
      returnType = 10;
      break;
    case  'B':
      returnType = 11;
      break;
    case  'C':
      returnType = 12;
      break;
    case  'D':
      returnType = 13;
      break;
    case  'E':
      returnType = 14;
      break;
    case  'F' :
      returnType = 15;
      break;
    default:
      returnType = 0;
      break;
  }
  return returnType;
}

写帖子的时间是6月20日,是父亲节,那么把“Happy father's day to all the daddys in the world!”翻译成十六进制的字符串呢?开源程序代码,其他就不反反覆覆,重规迭矩。

toCharArray.jpg


void setup() {
  Serial.begin(115200);
  while (!Serial);

  String inputString = "Happy father's day to all the daddys in the world!";
  int str_len = inputString.length() + 1;
  char char_array[str_len];
  inputString.toCharArray(char_array, str_len);

  Serial.println(char_array);
  delay(100);

  for (int i = 0 ; i < str_len - 1; i++) {
    Serial.print( char_array[i], HEX);
  }
  Serial.println();
  delay(100);
}

void loop() {
  ;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

atmega32u4芯片的主控最多有多少引脚?
atmega32u4芯片的主控最多
想自己diy一个键盘,涉及到的引脚比较多,淘宝找了下没找到相应的主控 需要atmega32u4
Arduino与S7-200 PLC 进行Modbus通信测试
Arduino与S7-200 PLC 进行
Modbus是一种串行通信协议,Modbus已经成为工业领域通信协议的业界标准,并且现在是工
Arduino Nano V3.0无法烧录问题
Arduino Nano V3.0无法烧
在t宝上买的那种改了“USB转TLL”芯片的nano板,上手后无法烧录程序,L灯闪烁(我的UN
请教一个有关NodeMCU和舵机的问题
请教一个有关NodeMCU和舵
[*]问题现象 我尝试使用网页控制NodeMCU引脚的方式来控制舵机。但是在程序烧进去
arduino pid麦克纳姆轮小车程序详解
arduino pid麦克纳姆轮小
之前发过几个帖子,大家可以参考,但经过多次尝试,整套系统升级了,优化了很多地方目录:
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表