stm32 实现串口中断接收浮点型、整型数据

       之前已经实现了在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,以便随时调用。

       这样我就可以在串口上发送数据,通过串口中断接收函数,得到数据。

       初来乍到,有问题的话可以提出来,大家共同进步!!!
























  • 13
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值