当前位置: 首页 > news >正文

玩转单片机之智能车小露——数字与字符串的转换与打印

在 玩转单片机之智能车小露——通过UART为单片机增加TTY终端 中我们在TTYEchoNumber中使用 printf 函数将数字输出到串口。其实数字很多时候都不是以数的形式表示的,几乎所有的输入和显示环节数字都是以字符串的形式来表示。
有没有想过,为什么使用键盘输入一串字符串,输入到计算机就会自动变成对应的数字了?有没有尝试过把单片机程序中的数字输出到串口、数码管或都显示屏上?
本文简单介绍单片机编程可能用到的数据与字符串的转换,以及标准输入输出stdio相关的一些补充知识。

printf使用(重定向)

#include <stdio.h>
void main(){printf("Hello,world!");
}

有多少人是从上面这个程序开始接触编程的?又有多少人在接触单片机后没有再使用过这个函数?
Keil的stdio中包含 printf 函数,但是使用时需要将 printf 的输出重定向到特定设备(如串口或显示屏),方法是重写putchar函数。
STC 库函数已默认将 printf 重定向到 UART,修改宏PRINTF_SELECT的值可以定向到不同的串口。

#define	PRINTF_SELECT  UART1		//选择 printf 函数所使用的串口,参数 UART1~UART4/********************* Printf 函数 ************************/
#if(PRINTF_SELECT == UART1)char putchar(char c){TX1_write2buff(c);return c;
}
#endif

printf 也可以定向到其它显示设备,如重写putchar函数将字符打印到 OLED 显示屏上并移动光标到下一个位置,即可以将 printf 重定向到 OLED 显示屏,在 玩转单片机之智能车小露——OLED显示屏控制 里我们将进行实现(如果有链接代表已完成实现)。

数字转换为字符串

数字转换为字符串一般都是用于输出和显示。转换原理也很简单,按位将数字替换成可以显示的数字代表的ASCII码值:
char = num + '0';
如果想具体了解转换过程可以搜索参考itoa函数的代码(不是标准库函数,不一定在所有平台中都可以直接使用)。实际上stdio提供了更加灵活的转换形式:

extern int printf(const char *, ...);
extern int sprintf(char *, const char *, ...);

sprintf用于将格式化的数据写入字符串中,而printf直接将格式化数据输出。这两个函数的功能在这里不再细述,需要注意的是,Keil Cx51是8位平台,printf 无法自动识别变量的位宽,直接使用%d%u打印数字时,可能会遇到输出异常的问题。(有没有哪个冤大头在ADC采样调试时使用 printf 输出采样数据一直显示错误,还在不停怀疑单片机或者库函数存在问题?)
要避免此类问题,必须显式定义数据类型传递给 printf 函数:

The optional characters b, h, and l may immediately precede the type character to respectively specify char, short, or long versions of the integer types d, i, u, o, and x.
(可选字母 b,h,l 可以用来指定 d,i,u,o,x 的整形是 char,short 还是 long)

char a = 1;
int b  = 12365;
long c = 0x7FFFFFFF;unsigned char x = 'A';
unsigned int y  = 54321;
unsigned long z = 0x4A6F6E00;printf ("char %bd int %d long %ld",a,b,c);
printf ("Uchar %bu Uint %u Ulong %lu",x,y,z);
printf ("xchar %bx xint %x xlong %lx",x,y,z);

字符串转换为数字

标准库stdlib提供了3个字符串转换为数字的函数,分别可以将字符串转换为浮点数、长整形和短整形。

extern float  atof (char *s1);
extern long   atol (char *s1);
extern int    atoi (char *s1);
http://www.zskr.cn/news/30499.html

相关文章:

  • linux磁盘管理-RAID介绍 - 详解
  • Link-Cut Tree
  • 线段上随机取n个点的最大距离期望
  • 第5天(中等题 滑动窗口、逆向思维)
  • Meet in the middle 学习笔记
  • 虚拟机下 安装 ubuntu 18.04
  • 路径规划算法学习Day2:广度优先搜索算法(BFS)
  • 完整教程:ros_control 中 hardware_interface 教程
  • 飞牛NAS的SSL证书过期,又开启了强制HTTPS,进不去界面修改SSL怎么办? - 详解
  • 多表查询-练习
  • 小程序原创--基于微信开发者工具实现的猜谜游戏程序 - 教程
  • ReactUse 与ahook对比 - 实践
  • 遗传改良中的核心技术:交配设计
  • 分享二个实用正则
  • 国际水稻研究所推出 AI 驱动的全球杂交水稻育种与亲本筛选数字平台
  • AI巨头动态:从OpenAI收购到Meta裁员,我们看到了什么?
  • Nature Plants | 植物转录因子结合图谱,360个转录因子的近3000个全基因组结合位点图谱
  • 【MyBatis】MyBatis 报错:Parameter ‘xxx‘ not found - 实践
  • Python 潮流周刊#74:创下吉尼斯世界记录的 Python 编程课
  • 10.26保养
  • CCPC2024济南个人题解
  • 作品目录
  • 【笔记】在WPF中 BulletDecorator 的功能、采用方式并对比 HeaderedContentControl 与常见 Panel 布局的区别
  • 刷题日记—洛谷循环题单 1.数学思想在算法题中的应用: 2.回文数的判定:
  • U623471 暂未定题目(无数据)
  • MAC地址类型速记
  • 【题解】洛谷P14308 【MX-S8-T1】斐波那契螺旋
  • 实验二 现代C++编程初体验
  • MCP Gateway 综述与实战指南
  • 清晨的阳光刚染红天边,我就钻进了彩虹色的热气球吊篮