历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-10-08 来源:eefocus

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


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

推荐阅读

史海拾趣

Blue Sky Research公司的发展小趣事

为了进一步提升竞争力,Blue Sky Research开始寻求产业链整合的机会。公司与上下游企业建立紧密的合作关系,共同推动激光技术产业的发展。通过整合产业链资源,Blue Sky Research实现了从原材料采购到产品销售的全流程控制,提高了生产效率和产品质量。同时,公司还积极参与行业标准的制定和推广,推动整个行业的健康发展。

ENSIGN公司的发展小趣事

ENSIGN在资本市场上的表现也备受关注。近年来,ENSIGN的股价稳步上涨,市值不断扩大。多家投资机构对ENSIGN的前景表示乐观,并上调了其目标股价。ENSIGN凭借其稳健的财务表现、强大的研发能力和广阔的市场前景,吸引了众多投资者的关注。

这些故事概述了ENSIGN在电子行业中的发展历程和多元化战略。通过不断创新和拓展业务领域,ENSIGN逐渐成为了电子行业中备受瞩目的企业之一。

Heatron LED Integration公司的发展小趣事

随着LED照明市场的不断扩大,Heatron LED Integration凭借敏锐的市场洞察力,迅速调整市场战略。公司不仅巩固了在国内市场的领先地位,还积极开拓国际市场,与多家国际知名企业建立了长期合作关系。通过参加国际展会、设立海外分支机构等方式,公司成功将产品推向全球多个国家和地区,实现了品牌的国际化。

DBM REFLEX公司的发展小趣事

在光学器件领域,技术创新是企业发展的关键。DBM REFLEX深知这一点,因此不断投入研发资源,致力于技术创新和产品创新。公司成功研发出了一系列具有高性能、高可靠性和高稳定性的光学器件,这些产品不仅满足了市场的需求,还为公司赢得了良好的口碑。

ELECTRONIC ASSEMBLY公司的发展小趣事

在环保日益受到重视的今天,一家名为“绿源电子组装”的公司积极响应国家号召,致力于推动绿色环保的产业发展。公司引进了一系列环保设备和材料,采用了低碳、节能的生产工艺和管理方式,实现了生产过程中的减排降耗。同时,绿源电子组装还积极参与社会公益活动,倡导绿色消费理念,为行业的可持续发展贡献了自己的力量。

ANADIGICS公司的发展小趣事

在电子组装行业,品质是企业的生命线。一家名为“品质电子组装”的公司,从创立之初就坚持以品质为核心竞争力。公司引进了国际先进的生产设备和管理体系,建立了严格的质量控制体系,确保每一件产品都符合高标准、严要求。正是凭借着对品质的坚守和追求,品质电子组装赢得了客户的广泛赞誉和信赖,逐渐在行业中树立了良好的口碑。

问答坊 | AI 解惑

卫星地球站 UPS 电源的使用与维护

广播电视卫星地球站是广播电视信号传输的重要部门 ,保证任何情况下的正常供电 ,是安全播出的重要环节。为此各卫星地球站内配备了 UPS 供电系统UPS 电源是卫星地球站保障供电稳定和连续性的重要设备 ,因其主机智能化程度高 ,储能器材采用免维护蓄电 ...…

查看全部问答>

中国测试测量企业:放眼未来,做眼前的事

近年来,随着信息化以及电子技术的发展,全世界测试仪器市场始终保持增长势头。根据市场研究机构Frost & Sullivan发布的报告显示,2011年全球测试测量市场预计将达到54.07亿美元。业内人士普遍认为,中国测试测量行业正面临前所未有的发展机遇。 ...…

查看全部问答>

回收金属镓,单晶硅,锗,等希贵金属13932899946郭

回收金属镓,单晶硅,锗,等希贵金属13932899946郭…

查看全部问答>

usb问题

请问做过wince下usb的大哥们,usbfn和usbhost是什么关系。一般驱动型的开发是开发那一块…

查看全部问答>

求助:串口发送出错

大家好!我在做单片机串口的驱动。串口接收还好,但是发送只要波特率一高,就会出错。 我设置9600波特率,发送数据基本正确,但是如果调到115200,发送数据基本上全错了。 我是用中断写的,每发完一个数据就会产生一个中断,由中断服务程序负责 ...…

查看全部问答>

1302时钟芯片时间不准确问题

我用1302做了个小程序,用八位数码管,轮流显示“年、月、日”和“星期、时、分”,首先显示年月日4秒,然后显示时间4秒,可是经过一段时间运行,时间相差很多,估计一天能差几个小时的样子吧,不知道为什么,我也查了些相关的资料,说是晶振问题, ...…

查看全部问答>

EVC中的try throw catch

今天我用EVC写了个小程序: int WINAPI WinMain(        HINSTANCE hInstance,                         HINSTANCE hPrevInstance,       &nb ...…

查看全部问答>

音乐芯片MIDI方面的问题,我实在想不明白。各位大哥大姐帮帮我吧!

我的工作是单片机编程。我们公司的音乐芯片是DREAM的(不知道大家知道不?),然而现在老板把一个芯片的编程全部交给我做,他对这个芯片也不是很懂,只不过他对DREAM的其它型号的芯片了解。我现在把我的问题介绍如下: 现在是学习MIDI编程,但在这 ...…

查看全部问答>

有一事不明

在调试12c调试的例程时:请看:主模式接受数据时while(NumByteToRead)    {    /* Test on EV7 and clear it */    if(I2C_CheckEvent(I2C1 ...…

查看全部问答>