编写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,如下输出结果:

### 回答1: 要实现STM32字符串整数的接收程序,可以使用库函数`strtol`。下面是一个实现的示例代码: ```c #include "stm32f4xx.h" #include <stdlib.h> #define BUFFER_SIZE 10 char buffer[BUFFER_SIZE]; int number; void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { static int byte_count = 0; char data = USART_ReceiveData(USART1); // 当接收到的字符是数字或者正负号时,将其保存到缓冲区中 if ((data >= '0' && data <= '9') || data == '+' || data == '-') { buffer[byte_count++] = data; // 如果接收到的字符个数达到缓冲区的大小,即表示接收到一个完整的字符串 if (byte_count >= BUFFER_SIZE) { // 将缓冲区的字符串换为整数并保存到number变量中 number = strtol(buffer, NULL, 10); byte_count = 0; } } } } int main(void) { // 初始化USART1和GPIO等相关的操作... // 使能USART1接收中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 进入主循环 while (1) { // 其他的操作... } } ``` 在上述代码中,我们首先定义了一个缓冲区`buffer`和一个整数变量`number`来保存字符串换后的整数。然后,在USART1接收中断处理程序`USART1_IRQHandler`中,我们每当接收到一个字符时,判断该字符是否为数字或者正负号。如果是,则将其存储到缓冲区中。当缓冲区中接收到的字符个数达到预设的大小时(例如10个字符),我们通过调用`strtol`函数将缓冲区的字符串换为整数,并将结果保存到`number`变量中。 在`main`函数中,我们将使能USART1的接收中断使能位,并进入主循环执行其他操作。这样,在接收到符合条件的字符串后,中断处理程序会自动将其换为整数并保存到`number`变量中,其他代码可以读取并使用该整数。 ### 回答2: 要实现STM32字符串整型的接收程序,可以按照以下步骤进行操作: 1. 首先,定义一个字符串变量来接收串口发送过来的字符串数据。可以使用数组来定义这个字符串变量,例如: ```c char receivedData[20]; // 假设接收的字符串长度不超过20 ``` 2. 接着,使用串口的接收函数(例如`HAL_UART_Receive()`)将接收到的字符存储到定义的字符串变量中,直到接收到结束符为止。例如: ```c HAL_UART_Receive(&huart1, (uint8_t *)receivedData, sizeof(receivedData)-1, HAL_MAX_DELAY); receivedData[sizeof(receivedData)-1] = '\0'; // 添加结束符 ``` 3. 然后,使用标准库函数`atoi()`将接收到的字符串换成整型。例如: ```c int number = atoi(receivedData); ``` 4. 最后,可以将整型数据发送回给发送端或进行其他处理。例如: ```c sprintf(receivedData, "%d", number); // 将整型数据换为字符串 HAL_UART_Transmit(&huart1, (uint8_t *)receivedData, strlen(receivedData), HAL_MAX_DELAY); // 发送整型数据给发送端 ``` 在以上步骤中,需要根据实际情况调整字符串的长度和串口的配置。另外,需要确保发送端发送的字符串能够被正确解析为整型数据,在发送时可以使用`sprintf()`函数将整型数据换为字符串。 ### 回答3: 要将字符串换为整型,我们可以使用C语言的标准库函数atoi()或者sscanf()。 首先,我们需要将接收到的字符串存储在一个字符数组中。我们可以使用UART串口接收数据,并将数据存储在一个缓冲区中。 接收程序的伪代码如下: ``` #include <stdio.h> #include <string.h> int main() { char buffer[20]; int number; printf("请输入一个整数字符串:"); fgets(buffer, sizeof(buffer), stdin); // 从用户输入获取字符串 buffer[strlen(buffer) - 1] = '\0'; // 去除末尾的换行符 number = atoi(buffer); // 使用atoi函数将字符串换为整型 printf("换后的整数为:%d\n", number); return 0; } ``` 另一种方法是使用sscanf()函数,可以根据指定的格式从字符串中提取整型数据。 ``` #include <stdio.h> #include <string.h> int main() { char buffer[20]; int number; printf("请输入一个整数字符串:"); fgets(buffer, sizeof(buffer), stdin); buffer[strlen(buffer) - 1] = '\0'; sscanf(buffer, "%d", &number); // 使用sscanf函数将字符串换为整型 printf("换后的整数为:%d\n", number); return 0; } ``` 以上是在C语言中进行字符串到整型的换的两种常用方法。在使用这些方法时需要注意,字符串必须符合整型的格式要求,否则可能会得到错误的结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值