完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
之前已经实现了在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,以便随时调用。 这样我就可以在串口上发送数据,通过串口中断接收函数,得到数据。 初来乍到,有问题的话可以提出来,大家共同进步!!! |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1777 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1080 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1678 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
595浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
554浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 07:33 , Processed in 0.925090 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号