之前已经实现了在stm32中移植printf函数和scanf函数,相信很多网友也已经熟练掌握这个技能了。最近在项目中遇到了问题,需要在串口助手中向下位机stm32写整型或者浮点型数据。这个时候只能使用串口中断接收函数。
void USART1_IRQHandler(void)
{
uint8_t ch;
while(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
ch=USART_ReceiveData(USART1);
}
}
但是很快发现程序这样写过于简陋,只能接收单个字符,不符合我的要求,然后参考网上例程又将串口接收中断函数进行改动。改为如下形式:
#define RxBufferSize 100 //接收数组定义尽量大点
uint8_t RxBuffer1[RxBufferSize ];
__IO uint8_t RxCounter= 0x00; //接收计数
uint8_t NbrOfDataToRead = RxBufferSize ;
/***************以上变量均为全局变量******************/
void USART1_IRQHandler(void)
{
while(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
RxBuffer1[RxCounter++] = USART_ReceiveData(USART1);
if(RxCounter1 == NbrOfDataToRead1) //如果达到最大计数,则不进行接收,中断关闭
{
USART_ITConfig(USARTy, USART_IT_RXNE, DISABLE);
}
}
}
上面的方面实现了将串口中断接收到的字符保存在数组中,可是问题还是来了,就是保存在数组中的数据是单个字符,并不能是我需要的整型或者浮点型数据,不能直接使用。感觉又白忙活了一天。
又在网上找资料,有人提了头文件#include "stdio.h"中的 sscanf函数,其函数原型为:
#pragma __scanf_args
extern _ARMABI int sscanf(const char * __restrict /*s*/,
const char * __restrict /*format*/, ...) __attribute__((__nonnull__(1,2)));
/*
* is equivalent to fscanf except that the argument s specifies a string
* from which the input is to be obtained, rather than from a stream.
* Reaching the end of the string is equivalent to encountering end-of-file
* for the fscanf function.
* Returns: the value of the macro EOF if an input failure occurs before any
* conversion. Otherwise, the scanf function returns the number of
* input items assigned, which can be fewer than provided for, or
* even zero, in the event of an early matching failure.
看到了这里终于找到出路了,sscanf()函数的作用很强大,这里不再赘述,感兴趣的网友可以自己百度下,介绍的很详细,我在这里只提及它的一个功能,就是可以把字符数组转换成字符串,大家想想,只要能够得到字符串,那么剩下的就简单多了。话不多说,直接来干货,下面给出如何将串口中断函数接收到的字符数组转换成字符串:
void USART1_IRQHandler(void)
{
static __IO uint8_t i=0;
char str1[100];
if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
ch[i++] = USART_ReceiveData(USART1);
if(ch[i-1] == '*')
{
sscanf(ch,"%[^*]",str1); //利用sscanf函数把字符数组转换成字符串,"%[^*]"表示取数据到*为止
convalue=atof(str1); //利用atof函数把字符串转换成浮点型数据
i=0;
}
}
}
上面的程序就是终极程序了,我来大概说明下:同理我先把接收的数据放到字符数组ch[]里面,我的结束标志‘*’,当判断接收到‘*'时,表示接收完毕,然后进入if语句,利用sscanf函数,把字符数组转换成字符串str1,然后我用函数atof()把字符串str1转换成浮点型数据并赋值给全局变量convalue,以便随时调用。
这样我就可以在串口上发送数据,通过串口中断接收函数,得到数据。
上一篇:STM32中的一些小坑-ADC通道设置-写FLASH
下一篇:STM32F1XX系列 HAL库 CAN大量收发数据
推荐阅读
史海拾趣
NIOS 设计从入门到精通.................................................. 1 目录 .................................................................. 3 总体概述 .............................................................. 5 第 ...… 查看全部问答∨ |
|
刚开始学习单片机时,需要一个开发板,对开发板上的元器件我们要有一个基本的了解,才能好好的进一步学习如何编写程序,现在给大家分享一个开发板常用芯片的资料,希望大家好好学习,天天向上… 查看全部问答∨ |
目录: A篇 数字电路解题技巧50法 A.1 数制与逻辑代数 一法2“进制数—2”进制数的快速转换法 二法优进制数—n进制数的通用转换法 三法求取逻辑函数最小项之和形式的三种解法 四法求取逻辑函数最大项之积形式的三种解法 五法用代数化简法 ...… 查看全部问答∨ |
我需要对+5V、 -5V 、+15 V、-15V 、+3.3V、+1.8V进行监测,其中+1.8V由+3.3V稳压,其他均由开关电源模块输出,且各路电流均很大10A以上,主要监测各路输出是否正常,相当于实时自检上报电源状态是否正常,通过LED显示出来。还有一个问题就是假如某 ...… 查看全部问答∨ |
各位英雄: 小弟的开发环境:PXA270+WINCE5.0,摄像头为OV9650,现在要开发驱动及测试应用程序。手上的驱动源码是ADCM2650的,而且貌似支持DirectShow,因为导出函数有: CAM_Init CAM_Deinit   ...… 查看全部问答∨ |
基于ZigBee技术的远程医疗监护系统设计方案摘 要:将无线传感器网络引入医疗监护系统,提出了一种由ZigBee传感器和无线局域网构成的远程医疗监护系统的体系结构和具体实现方法。系统中,节点和基站设备所使用的近距离通信标准为802. 15. 4 /ZigBee ...… 查看全部问答∨ |