历史上的今天

今天是:2024年10月08日(星期二)

正在发生

2019年10月08日 | stm32 实现串口中断接收浮点型、整型数据

发布者:来来去去来来 来源: eefocus关键字: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,以便随时调用。


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

关键字:stm32  串口中断  接收浮点型  整型数据 引用地址:stm32 实现串口中断接收浮点型、整型数据

上一篇:STM32中的一些小坑-ADC通道设置-写FLASH
下一篇:STM32F1XX系列 HAL库 CAN大量收发数据

推荐阅读

KEIL RVMDK编译后的信息Program Size: Code=86496 RO-data=9064 RW-data=1452 ZI-data=16116 Code:代码占用的空间;RO-data: Read Only ,只读常量的大小,如const型;RW-data:Read Write, 初始化了的可读写变量的大小;ZI-data:Zero Initialize,没有初始化的可读写变量的大小,ZI-data不会被算做代码里因为不会被初始化。烧写时FLASH中...
日前,莱迪思(Lattice)宣布推出CorssLink升级版CrossLinkPlus FPGA系列产品,适用于采用MIPI D-PHY的嵌入式视觉系统。CrossLinkPlus器件作为创新的低功耗FPGA,拥有集成闪存、一个硬MIPI D-PHY、可实现面板瞬时显示的高速I/O以及灵活的片上编程特性。此外还提供现成的IP和参考设计来加速实现和增强传感器与显示器的桥接、聚合和分屏功能,这些是工业...
NVIDIA发布重磅应用、系统以及与宝马集团合作 NVIDIA提出了下一代计算的愿景,该愿景将全球信息经济的重心从服务器转移到了新型的强大且灵活的数据。 NVIDIA创始人兼首席执行官在其加州住宅的厨房中录制的六集同时发布的主题演讲中,介绍了NVIDIA最近对Mellanox的收购,还有重盼所归的基于NVIDIA Ampere 架构的新产品以及重要的最新软件技术。 这场...
广告摘要声明广告近期,世界经济论坛公布了2021年最新一批“灯塔工厂”名单,全球有21家“灯塔工厂”入选,其中10家在中国。而中信戴卡秦皇岛铝车轮工厂成为了河北省唯一入选的企业,也是全球汽车轮毂行业首家入选企业。中信集团董事长朱鹤新在9月29日全球灯塔工厂网络年会上的发言中表示,数字化发展正在重构经济竞争新格局、产业演进新模式和企业发展新...

史海拾趣

问答坊 | AI 解惑

SH69P42 OTP4-位带SAR8-位A-D转换器单片机

本电子书将很简单的介绍SH69P42 OTP4-位带SAR8-位A-D转换器单片机…

查看全部问答∨

NIOS 设计从入门到精通

NIOS 设计从入门到精通.................................................. 1 目录 .................................................................. 3 总体概述 .............................................................. 5 第 ...…

查看全部问答∨

51开发板常用芯片pdf资料

刚开始学习单片机时,需要一个开发板,对开发板上的元器件我们要有一个基本的了解,才能好好的进一步学习如何编写程序,现在给大家分享一个开发板常用芯片的资料,希望大家好好学习,天天向上…

查看全部问答∨

【藏书阁】数字电路解题技巧50法及题解300例

目录: A篇 数字电路解题技巧50法 A.1 数制与逻辑代数 一法2“进制数—2”进制数的快速转换法 二法优进制数—n进制数的通用转换法 三法求取逻辑函数最小项之和形式的三种解法 四法求取逻辑函数最大项之积形式的三种解法 五法用代数化简法 ...…

查看全部问答∨

请问ADM1066芯片管理怎么用!

我需要对+5V、 -5V 、+15 V、-15V 、+3.3V、+1.8V进行监测,其中+1.8V由+3.3V稳压,其他均由开关电源模块输出,且各路电流均很大10A以上,主要监测各路输出是否正常,相当于实时自检上报电源状态是否正常,通过LED显示出来。还有一个问题就是假如某 ...…

查看全部问答∨

WINCE 5.0 摄像头驱动(PXA270)

各位英雄:     小弟的开发环境:PXA270+WINCE5.0,摄像头为OV9650,现在要开发驱动及测试应用程序。手上的驱动源码是ADCM2650的,而且貌似支持DirectShow,因为导出函数有:     CAM_Init     CAM_Deinit   ...…

查看全部问答∨

音量与增益的问题

在电路上先增益调节,后音量调节 如何寻找一个平衡点,在用耳机听时,使的在调增益的时候,音量在增大;在增益不变的情况下,调节音量,音量也在增大,并且在这个过程中,用耳机听不到类似于自激的现象…

查看全部问答∨

向44b0上移植uclinux时可能会用的工具软件包

在网上花了点时间找到的。 [ 本帖最后由 范小川 于 2010-9-14 22:51 编辑 ]…

查看全部问答∨

STR710的启动问题

                                 请问斑竹,我打算在144pin 的str710 上外扩一片2M的Norflash 和一片Sdram,特别说明这个系统不 ...…

查看全部问答∨

基于ZigBee技术的远程医疗监护系统设计方案

基于ZigBee技术的远程医疗监护系统设计方案摘 要:将无线传感器网络引入医疗监护系统,提出了一种由ZigBee传感器和无线局域网构成的远程医疗监护系统的体系结构和具体实现方法。系统中,节点和基站设备所使用的近距离通信标准为802. 15. 4 /ZigBee ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved