当前位置: 首页 > 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.hskmm.com/?act=detail&tid=39069

相关文章:

  • 数据采集作业1 102302111 海米沙
  • 嵌入子流形
  • Link-Cut Tree
  • 列表,集合,字典的增、删、查、改方法对比
  • MusicFree 音乐
  • 线段上随机取n个点的最大距离期望
  • RuoYi-Cloud-Plus 数据权限实现原理解析
  • 第5天(中等题 滑动窗口、逆向思维)
  • P10老板一句‘搞不定就P0’,15分钟我用Arthas捞回1000万资损 - 指南
  • 华为堡垒机
  • [HZOI] CSP-S模拟38 赛后总结
  • Meet in the middle 学习笔记
  • 集合常见操作示例
  • 深入解析:港大和字节携手打造WorldWeaver:以统一建模方案整合感知条件,为长视频生成领域带来质量与一致性双重飞跃。
  • 集合与列表有何不同的使用场景,如何选择?
  • 虚拟机下 安装 ubuntu 18.04
  • MinIO快速入门
  • 多表查询-练习
  • 实验3:卷积神经网络 - OUC
  • 使用 Docker Compose 在 CentOS 7 单机服务器上部署多实例 MinIO 集群
  • 102302147傅乐宜作业1
  • 多智能体大模型在农业中的应用研究与展望
  • 嵌入式基础作业--第七周--IIC协议采集温湿度与OLED显示
  • Nature子刊 | 基于生物学信息的神经网络
  • 软件开发(10.23)
  • 2025年项目总延期?这30款项目进度管理软件一定有一款适合你!
  • Educational Codeforces Round 66 (Rated for Div. 2) A~F
  • 鲁东大学提出可解释的自适应集成机器学习全基因组选择算法用于小麦产量性状关键SNPs筛选
  • 台球厅收银台押金原路退回系统押金预授权—东方仙盟 - 详解
  • if 语句