| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 编写STM32 C程序:字符串String转数字 数字转字符串String -> 正文阅读 |
|
[嵌入式]编写STM32 C程序:字符串String转数字 数字转字符串String |
在做嵌入式C程序开发中,如果通信协议采用字符串方式来交互数据,比如使用到AT指令格式,或者需要GUI界面的显示,那么就会经常用到数字类型与字符串类型的转换。在C语言标准库stdlib中提供了多个字符串与数字类型的转换函数,丰富的转换功能能够满足绝大多数的需求,方便了C语言的开发。 1.1、数字类型 多个数据在内存中是连续存储的,彼此之间没有明显的界限,如果不明确指明数据的长度,计算机就不知道何时存取结束。因此,C语言的数据类型就是明确指明了当前数据的长度信息。 C语言自带的基本数字数据类型有char(字符型)、short(短整型)、int(整型)、long(长整型)、long long(长整型)、float(单精度浮点型)、double(双精度浮点型)、void *(指针型)。每个数据类型的所占用的字节数都是固定的,知道了数据类型,也就知道了数据的长度。 ???????? 对于指定编译器,每种数据类型的长度是固定的,因此根据数据类型定义了数据后,其在内存中的存取位置大小也是固定,如图所示,定义了char/short/int/longlong类型的数据,其在内存中的分配情况,数据按小端存储。 目前采用MDK的内置ARMCC5.0编译器中,各种数据类型的长度如上图的32位栏中所示,与ARMCC5.0编译后在MCU执行所获取的类型长度一致。 输出的类型长度信息如下图所示: 1.2、字符串 ???????? 基于STM32芯片的C编程,字符串的表现形式可以是常量字符串或保存于数组中,如下图所示: ???????? 数字字符串就是将C语言的基本数字类型,转换为C语言的字符串形式,C语言的标准库stdlib中提供了许多的转换函数。 其中itoa()、ltoa()、ultoa()函数不是标准的ANSI,一般只在Windows平台下的C编译器支持,Linux平台下的GCC编译器不一定支持这3个函数。因此如果需要进行跨平台开发,数字类型转为字符串类型,应采用标准ANSI C支持的sprintf()函数。
2.1、itoa()、ltoa()、ultoa()函数 函数原型: char *itoa(int value,char *string,int radix) 将整数value转换成字串存入string,radix为转换所用基数. char *ltoa(long value,char *string,int radix) 将长整型数value转换成字符串并返回该字符串,radix为转换时所用基数 char *ultoa(unsigned long value,char *string,int radix) 将无符号长整型数value转换成字符串并返回该字符串,radix为转换时所用基数 参数说明: value:欲转换的数据。 string:目标字符串的地址。 radix:转换后的进制数,可以是2进制、8进制、10进制、16进制等。 使用示例: 其中转换完成后,会在aStr内存中保存转换的值加上结尾的空字符(‘\0’)。 itoa()、ltoa()、ultoa()函数这3个函数在ARMCC编译器下是不支持的,链接时找不到函数定义。因此STM32芯片进行C编程需要使用sprintf()函数。 2.2、fcvt()函数 函数原型: ??char *fcvt(double value, int ndigit, int *decpt, int *sign); 将value所代表的小数,转换为字符串返回。 参数说明: value:要转换的浮点数(输入参数) ndigit:小数的位数(输入参数) decpt:表示小数点的位置(输出参数) sign:表示value的符号,0为正数,1为负数(输出参数) 返回:转换后的字符串内容 使用示例: fcvt()函数这个函数在ARMCC编译器下是不支持的,链接时在stdlib.h头文件中找不到函数定义。 因此STM32芯片进行C编程需要使用sprintf()函数。但是在pc下通过wingcc编译没有问题,输出结果如下所示: fcvt()转换的结果是将一个小数的值、符号位、小数点区分开来表示,而不是直接字符串显示整个小数值(如“-123.45000”), 2.3、gcvt()函数 函数原型: char *gcvt(double value, int ndigit, char *buf) 将value所代表的小数,转换为字符串保存于buf中。 参数说明: value:要转换的浮点数(输入参数) ndigit:小数的有效位数(输入参数) buf:保存字符串的缓冲地址(输出参数) 使用示例: 同样的,gcvt()函数这个函数在ARMCC编译器下是不支持的,链接时在stdlib.h头文件中找不到函数定义。 但是在pc下通过wingcc编译没有问题,输出结果如下所示: 2.4、sprintf()函数 以上几个转换函数在armcc下均不支持,因此需要用到sprintf()函数将数字转换为字符串,sprintf()函数在c标准内是支持的,armcc也支持。 函数原型: ?int sprintf(char *str, const char *format, ...) 发送格式化输出到?str?所指向的字符串。 参数说明: str?:这是指向一个字符数组的指针,该数组存储了 C 字符串 format?:这是字符串,包含了要被写入到字符串 str 的文本。Format参数的格式?%[flags][width][.precision][length]specifier,具体讲解如下: 使用示例一,整数转字符串: 其中转换完成后,会在aStr内存中保存转换的值加上结尾的空字符(‘\0’)。 分别将idata转换为8进制、10进制、16进制的字符串,并打印输出: 使用示例二,小数转字符串: 通过指定小数点后面的位数来输出不同的小数精度,科学计数法比较容易损失数据精度,以上转换的输出结果为:
?3.1、atoi()、atol()、atof()函数 函数原型: int atoi (const char * str); 解析字符串str,将其内容解释为整数,返回int类型的值。 long int atol ( const char * str ); 解析字符串str,将其内容解释为长整数,返回long类型的值。 double atof (const char* str); 解析字符串str,将其内容解释为浮点型,返回double类型的值。 参数说明: str:包含数字的字符串。 函数首先丢弃str中所有必要的空格字符,直到找到一个非空格字符,然后从这个字符开始,先查找符号位(+/-),后面再找尽可能多的以10为基数的数字,直到遇到非数字字符结束,然后开始转换。 使用示例: atoi()、atol()、atof()函数在armcc下是支持的,因此编译没问题,执行后输出如下结果: 3.2、strtof()、strtol()函数 ???????? 这两个函数可以连续转换字符串里面的多个数字子串,如:str=”1.23 33.456”里面有两个子串”1.23”与”33.456”,因此可以连续调用strtof()函数获取该值。 函数原型: float strtof (const char* str, char** endptr) 函数首先丢弃str中所有必要的空格字符,直到找到一个非空格字符,然后从这个字符开始,先查找符号位(+/-),后面再找尽可能多的以10为基数的数字,直到遇到空格字符结束,然后开始转换。如果endptr不是空指针,该函数还将endptr的值设置为指向上次转换的数字后面的第一个字符。 long int strtol (const char* str, char** endptr, int base); 函数首先丢弃str中所有必要的空格字符,直到找到一个非空格字符,然后从这个字符开始,先查找符号位(+/-),后面再找尽可能多的以base为基数的数字,直到遇到空格字符结束,然后开始转换。如果endptr不是空指针,该函数还将endptr的值设置为指向上次转换的数字后面的第一个字符。 使用示例一,strtol()函数: 输出结果为(10进制打印): 注:如果str或endptr首字符非法,如“mk2001 60c0c0”以mk非法字符开头,转换的结果为0。 使用示例二,strtof()函数: 输出结果为: 注:如果str或endptr首字符非法,如"K686.97 365.24 1.2345",以K非法字符开头,转换的结果为0.0,如下输出结果: |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 4:48:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |